微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过熊猫中不同的列值重组每日时间序列?

如何解决如何通过熊猫中不同的列值重组每日时间序列?

我有美国不同县的每日时间序列数据,这是covid案例的每日时间序列,我想对其进行重组/重塑以便与我拥有的其他时间序列数据一起使用。因此,我尝试使用groupby操作对时间序列进行重新组合,但出现如下值错误

ValueError:对于对象类型DataFrame,没有名为County_state的轴

我不确定使用groupby是正确的选择。有人可以建议在熊猫中做到这一点的可能方法吗?有想法吗?

当前尝试

这里是reproducible data on gist。这是我目前的尝试:

import pandas as pd

df = pd.read_csv("df.csv")
df['date'] = pd.to_datetime(df['date'])
df.groupby('date','county_state')['cases','deaths'].unstack().reset_index()

,但是以上尝试均无效,这会导致ValueError。谁能建议如何做到这一点?

所需的输出

这是我期望的数据帧的输出结构,无需使用casesdeaths进行聚合。

    date    fips    cases   deaths  county_state
1/26/2020   4013    1   0   Maricopa_Arizona
1/27/2020   4013    5    0  Maricopa_Arizona
1/28/2020   4013    7    0  Maricopa_Arizona
...         
9/02/202    4013    2333  100     Maricopa_Arizona
1/26/2020   6037    1   0   Los Angeles_California
1/27/2020   6037    15    2  Los Angeles_California
1/28/2020   6037    20    4  Los Angeles_California
...
9/02/202    6037    10001  200     Los Angeles_California

如何实现上述预期输出?有什么办法在大熊猫上做到这一点?

解决方法

您需要执行此操作才能正确导入CSV,CSV在每行末尾存在一些空格问题,并且分隔符为''。最好将县和州划分为不同的列,对其进行排序,然后将其删除:

df = pd.read_csv('df.csv',sep='    ')
df.drop(columns='Unnamed: 5',inplace=True)
df['date'] = pd.to_datetime(df['date'])
df['state'] = df['county_state'].str.split('_').str[1]
df['county'] = df['county_state'].str.split('_').str[0]
df.sort_values(by=['state','county','date'],inplace=True)
df.drop(columns=['state','county'],inplace=True)
print(df)

            date   fips  cases  deaths      county_state
0    2020-01-26   4013      1       0  Maricopa_Arizona
2    2020-01-27   4013      1       0  Maricopa_Arizona
4    2020-01-28   4013      1       0  Maricopa_Arizona
6    2020-01-29   4013      1       0  Maricopa_Arizona
8    2020-01-30   4013      1       0  Maricopa_Arizona
...         ...    ...    ...     ...               ...
7280 2020-08-29  55081    280       2  Monroe_Wisconsin
7325 2020-08-30  55081    281       2  Monroe_Wisconsin
7370 2020-08-31  55081    282       2  Monroe_Wisconsin
7415 2020-09-01  55081    286       2  Monroe_Wisconsin
7460 2020-09-02  55081    290       2  Monroe_Wisconsin

[7461 rows x 5 columns]
,

我认为这会为您提供所需的输出:

if (responseParsed.intents[0].name == 'Math') { message.channel.send(eval(data));

编辑: 像这样读取数据帧:

df.groupby(['fips','county_state','date']).sum().reset_index()[["date","fips","cases","deaths","county_state"]]

结果:

df = pd.read_csv("https://gist.github.com/jerry-shad/f372d7a05e1a63732665fad0c7c754d0/raw/425b91083519adae00056aac3b25dcb3cfda42bc/df.csv",sep="\t").drop(columns=["Unnamed: 5"])
,

这是一个潜在的解决方案:

  • 通过pd.read_csv读取csv,并将date设为df的index,并将drop设为不必要的列。
df = pd.read_csv('df.csv',parse_dates=['date'],index_col=['date']) 
df.drop(columns=['Unnamed: 5'],inplace=True)
  • groupbyresample一起使用。
df.groupby(['fips','county_state']).resample('1D').sum()

输出(仅dataframe的开头):

                                 fips  cases  deaths
fips county_state     date                           
4013 Maricopa_Arizona 2020-01-26  4013      1       0
                      2020-01-27  4013      1       0
                      2020-01-28  4013      1       0
                      2020-01-29  4013      1       0
                      2020-01-30  4013      1       0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。