重新编制索引并填充缺失的日期

2024-10-01 09:30:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这种格式的数据帧。在

       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 

这个数据帧的索引是我使用PeriodIndex创建的季度之后的年份。dates列也象征着年和季度,月的哪一天无关紧要。我想总结一下每个季度的其他专栏文章。通常这不是问题,因为我可以做italy.groupby('dates').sum()。但是,我得到的输出是

^{pr2}$

现在的问题是,我要为每一个没有出现的季度填充缺失的值,这样输出就会变成这样

                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 

我查阅了之前的问题,发现人们建议我这样做。问题是,这会给我的数据增加很多行,因为我每天都会有数据,这意味着我必须重新找到一种方法,将数据按季度相加。那么,我如何实现这个目标,而不创建所有这些每日0,并找到一个方法来总结每季度的一切呢?在

作为参考,dates列是通过首先将原始months列更改为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')

Tags: 数据方法df格式propertymultiplecountrysuccess
1条回答
网友
1楼 · 发布于 2024-10-01 09:30:55

更新:解析字符串索引中的实际日期。它也适用于老版熊猫:

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

旧答案:(假设dates列包含实际日期)。它使用了新的Pandas 0.19.0特性:.resample(..., on='column_name')

试试这个:

^{pr2}$

或重新抽样“每月”:

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

相关问题 更多 >