按组补全缺失时间行并向下填充Amount值的Pandas实现
按分组补全缺失时间并向下填充数值的解决方案
问题场景
给定如下DataFrame:
| Name | Time Elapsed | Amount |
|---|---|---|
| A | 2 | $2 |
| A | 5 | $1 |
| A | 7 | $6 |
| B | 3 | $3 |
| B | 5 | $5 |
需求:按Name分组,补全每组内Time Elapsed从最小值到最大值之间的所有缺失时间行,然后向下填充Amount字段,得到目标结果。
方案一:分组生成完整时间序列后合并填充
核心思路是对每个分组单独生成完整的时间范围,再与原数据合并,最后完成向下填充。
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Name': ['A', 'A', 'A', 'B', 'B'], 'Time Elapsed': [2, 5, 7, 3, 5], 'Amount': ['$2', '$1', '$6', '$3', '$5'] }) def process_group(group): # 获取当前分组的时间起止值 min_t = group['Time Elapsed'].min() max_t = group['Time Elapsed'].max() # 生成该分组的完整时间序列 full_time_df = pd.DataFrame({'Time Elapsed': range(min_t, max_t + 1)}) # 合并原分组数据,保留Name字段 merged = full_time_df.merge(group, on='Time Elapsed', how='left') merged['Name'] = group['Name'].iloc[0] # 向下填充缺失的Amount值 merged['Amount'] = merged['Amount'].ffill() return merged # 应用分组处理并合并结果 final_df = df.groupby('Name', group_keys=False).apply(process_group).reset_index(drop=True) print(final_df)
方案二:利用explode展开完整时间列表
先为每个分组生成包含所有时间的列表,通过explode展开为行,再按组向下填充缺失值。
import pandas as pd df = pd.DataFrame({ 'Name': ['A', 'A', 'A', 'B', 'B'], 'Time Elapsed': [2, 5, 7, 3, 5], 'Amount': ['$2', '$1', '$6', '$3', '$5'] }) # 按分组生成完整时间范围和对应Amount列表 grouped = df.groupby('Name').apply( lambda g: pd.Series({ 'Time Elapsed': list(range(g['Time Elapsed'].min(), g['Time Elapsed'].max() + 1)), 'Amount': g['Amount'].tolist() }) ).reset_index() # 展开时间序列并填充缺失值 result = grouped.explode('Time Elapsed') result['Amount'] = result.groupby('Name')['Amount'].ffill() # 修正数据类型 result['Time Elapsed'] = result['Time Elapsed'].astype(int) print(result)
内容的提问来源于stack exchange,提问作者lakadibo
相关产品推荐
相关产品推荐

