Pandas按ID分组扩展DataFrame缺失日期并按规则填充Amount值
问题解决方案
实现思路
按ID分组后对每个分组单独处理,核心步骤如下:
- 对每个ID取最早和最晚的记录,计算该分组需要补全的日期范围:最早记录所在月份的1日为起始,最晚记录所在月份的月末为结束
- 生成连续单日日期序列,和原数据合并补全所有日期
- 先填充首月早于首条记录的日期Amount为0,其余缺失值使用前向填充取最近的已有观测值
完整实现代码
import pandas as pd # 示例数据初始化 df = pd.DataFrame({ "ID":[1,1,1,2,2,2], "Date":["29.12.2020","05.01.2021","15.02.2021","11.04.2021","27.05.2021","29.05.2021"], "Amount":[6,5,7,9,8,7] }) # 明确指定日期格式为日/月/年避免解析错误 df["Date"] = pd.to_datetime(df["Date"], dayfirst=True) # 定义分组处理函数 def fill_id_group(group): first_rec = group.iloc[0] last_rec = group.iloc[-1] # 计算分组日期范围 start_dt = first_rec['Date'].to_period('M').to_timestamp('D') end_dt = last_rec['Date'].to_period('M').to_timestamp(how='end').normalize() # 生成连续日期并重构索引 full_dates = pd.date_range(start=start_dt, end=end_dt, freq='D') group = group.set_index('Date').reindex(full_dates).rename_axis('Date').reset_index() # 补全ID列 group['ID'] = first_rec['ID'] # 按规则填充Amount # 规则1:首月早于首条记录的日期填充0 first_month = first_rec['Date'].to_period('M') group.loc[(group['Date'] < first_rec['Date']) & (group['Date'].dt.to_period('M') == first_month), 'Amount'] = 0 # 其余缺失值前向填充 group['Amount'] = group['Amount'].ffill().astype(int) return group # 分组执行处理得到最终结果 result = df.groupby('ID', group_keys=False).apply(fill_id_group)
结果验证
你可以通过以下代码查看对应ID的补全结果:
# 查看ID=1的补全结果 print(result[result['ID']==1]) # 查看ID=2的补全结果 print(result[result['ID']==2])
内容的提问来源于stack exchange,提问作者Larx
相关产品推荐
相关产品推荐

