我有一个采用这种格式的 DataFrame。
country_txt multiple success nkill nwound property dates \
1970Q1 Italy 0 1 0.0 0.0 0 1970-01-01
1970Q1 Italy 0 0 0.0 0.0 1 1970-01-01
1970Q4 Italy 0 0 0.0 0.0 1 1970-04-01
1971Q1 Italy 0 1 0.0 0.0 1 1971-01-01
1971Q3 Italy 0 1 0.0 0.0 1 1971-03-01
此 DataFrame 的索引是我使用 PeriodIndex
创建的年份和季度。 dates
列也表示年份和季度,月份中的日期无关紧要。我想总结每个季度的所有其他列。通常这不是问题,因为我可以执行 italy.groupby('dates').sum()
操作。但是,我得到的输出是这样的
multiple success nkill nwound property
dates
1970-01-01 0 1 0.0 0.0 1
1970-04-01 0 0 0.0 0.0 1
1971-01-01 0 1 0.0 0.0 1
现在的问题是我想填充每个未出现的季度的缺失值,因此输出看起来像这样,
multiple success nkill nwound property
dates
1970-01-01 0 1 0.0 0.0 1
1970-02-01 0 0 0.0 0.0 0
1970-03-01 0 0 0.0 0.0 0
1970-04-01 0 0 0.0 0.0 1
1971-01-01 0 1 0.0 0.0 1
我查阅了之前的问题,发现人们建议我这样做df.reindex(pd.date_range("1970-01-01", "2015-12-31"), fill_value = 0)
。问题是这样的,这会给我的数据带来很多额外的行,因为我每天都会有数据,这意味着我必须找到一种方法来重新按季度对数据求和。那么,如果不创造所有这些每日 0 并找到按季度再次总结所有内容的方法,我该如何实现这一目标呢?
作为引用,dates
列的创建方法是首先将原始月份列更改为 1-4 之间的值(表示季度),然后通过执行此操作将其转换为 timedelta 格式
df['dates'] = df.iyear.astype(str).str.cat(df.imonth.astype(str))
df['dates'] = pd.to_datetime(df['dates'], format = '%Y%m')
最佳答案
更新:从字符串索引中解析真实日期。它也应该适用于较旧的 Pandas 版本:
In [212]: df.set_index(pd.to_datetime(df.index)).resample('QS').sum().fillna(0)
Out[212]:
multiple success nkill nwound property
idx
1970-01-01 0.0 1.0 0.0 0.0 1.0
1970-04-01 0.0 0.0 0.0 0.0 0.0
1970-07-01 0.0 0.0 0.0 0.0 0.0
1970-10-01 0.0 0.0 0.0 0.0 1.0
1971-01-01 0.0 1.0 0.0 0.0 1.0
1971-04-01 0.0 0.0 0.0 0.0 0.0
1971-07-01 0.0 1.0 0.0 0.0 1.0
旧答案:(假设日期
列包含真实日期)。它使用新的 Pandas 0.19.0 功能:.resample(..., on='column_name')
:
试试这个:
In [205]: df.resample('QS', on='dates').sum().fillna(0)
Out[205]:
multiple success nkill nwound property
dates
1970-01-01 0.0 1.0 0.0 0.0 1.0
1970-04-01 0.0 0.0 0.0 0.0 1.0
1970-07-01 0.0 0.0 0.0 0.0 0.0
1970-10-01 0.0 0.0 0.0 0.0 0.0
1971-01-01 0.0 2.0 0.0 0.0 2.0
或“每月”重新采样:
In [207]: df.resample('QS', on='dates').sum().resample('MS').sum().fillna(0)
Out[207]:
multiple success nkill nwound property
dates
1970-01-01 0.0 1.0 0.0 0.0 1.0
1970-02-01 0.0 0.0 0.0 0.0 0.0
1970-03-01 0.0 0.0 0.0 0.0 0.0
1970-04-01 0.0 0.0 0.0 0.0 1.0
1970-05-01 0.0 0.0 0.0 0.0 0.0
1970-06-01 0.0 0.0 0.0 0.0 0.0
1970-07-01 0.0 0.0 0.0 0.0 0.0
1970-08-01 0.0 0.0 0.0 0.0 0.0
1970-09-01 0.0 0.0 0.0 0.0 0.0
1970-10-01 0.0 0.0 0.0 0.0 0.0
1970-11-01 0.0 0.0 0.0 0.0 0.0
1970-12-01 0.0 0.0 0.0 0.0 0.0
1971-01-01 0.0 2.0 0.0 0.0 2.0
关于python - 重新索引并填写缺失的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228505/