问题描述
我有美国不同县的每日时间序列数据,这是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
。谁能建议如何做到这一点?
所需的输出
这是我期望的数据帧的输出结构,无需使用cases
或deaths
进行聚合。
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)
- 将
groupby
与resample
一起使用。
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