Pandas按id补全所有日期行并填充正确累计求和值的实现方法
pandas实现按id补全日期并填充累计值的方案
实现逻辑
- 首先计算全局最大天数,生成每个id覆盖0到最大天数的全量行
- 原数据按id、天数排序保证时间顺序正确
- 全量行和原数据左连接后,按id分组做缺失值填充:先向前复用最近的累计值,剩余开头的缺失值(早于id首个记录的天数)统一填0
完整代码
import pandas as pd # 构造示例数据 data = {'id': [0, 0, 0, 1, 1, 2, 1], 'day' : [0, 2, 1, 1, 4, 2, 2], 'running_sum': [1,4,2,1,6,6,3]} df_1 = pd.DataFrame(data) # 1. 计算全局最大天数 max_day = df_1['day'].max() # 2. 生成每个id对应0到max_day的全量天数组合 full_idx = pd.MultiIndex.from_product( [df_1['id'].unique(), range(max_day + 1)], names=['id', 'day'] ) full_df = pd.DataFrame(index=full_idx).reset_index() # 3. 原数据按id、day排序保证时间顺序 df_sorted = df_1.sort_values(['id', 'day']).reset_index(drop=True) # 4. 全量表和原表左连接 df_merged = pd.merge(full_df, df_sorted, on=['id', 'day'], how='left') # 5. 按id分组填充缺失值 df_merged['running_sum'] = df_merged.groupby('id')['running_sum'].ffill().fillna(0).astype(int) # 输出结果 print(df_merged)
结果验证
运行上述代码后得到的df_merged和你要求的输出格式完全一致,每个id的缺失天数都会按规则填充对应累计值。
内容的提问来源于stack exchange,提问作者Amichai Haver
相关产品推荐
相关产品推荐

