Skip to main content
 首页 » 编程设计

python之如何在 groupby 之后为 pandas 中的每个组补充缺失的日期

2025年05月04日20JustinYoung

我的目标是用 data 行中的 0 来补充每个 project_id 缺失的日期条目。

例如

df = pd.DataFrame({ 
    'project_id': ['A', 'A', 'A', 'B', 'B'],  
    'timestamp': ['2018-01-01', '2018-03-01', '2018-04-01', '2018-03-01', '2018-06-01'],  
    'data': [100, 28, 45, 64, 55]}) 

这是

  project_id   timestamp  data 
0          A  2018-01-01   100 
1          A  2018-03-01    28 
2          A  2018-04-01    45 
3          B  2018-03-01    64 
4          B  2018-06-01    55 

将成为

  project_id   timestamp  data 
0          A  2018-01-01   100 
1          A  2018-02-01     0 
2          A  2018-03-01    28 
3          A  2018-04-01    45 
4          B  2018-03-01    64 
5          B  2018-04-01     0 
6          B  2018-05-01     0 
7          B  2018-06-01    55 

其中添加了索引 1、5 和 6。

我目前的做法:

df.groupby('project_id').apply(lambda x: x[['timestamp', 'data']].set_index('timestamp').asfreq('M', how='start', fill_value=0)) 

显然是错误的,因为它将所有内容都设置为 0 并且不是一个月的第一个日期而是最后一个日期重新采样 - 尽管我认为这应该由 how 处理.

如何在 groupby 之后扩展/补充缺少的 datetime 条目以获得每个组的连续时间序列?

请您参考如下方法:

你很接近:

df.timestamp = pd.to_datetime(df.timestamp) 
 
# notice 'MS' 
new_df = df.groupby('project_id').apply(lambda x: x[['timestamp', 'data']] 
                                                    .set_index('timestamp').asfreq('MS')) 
 
new_df.data = df.set_index(['project_id', 'timestamp']).data 
df = new_df.fillna(0).reset_index()