You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按组补全缺失时间行并向下填充Amount值的Pandas实现

按分组补全缺失时间并向下填充数值的解决方案

问题场景

给定如下DataFrame:

NameTime ElapsedAmount
A2$2
A5$1
A7$6
B3$3
B5$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:31:11