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

如何在Pandas中为每个用户填充最后一个非空值?解决ffill异常

解决按用户填充最近非空购买金额的问题

问题分析

你需要实现的是按user_id分组,对purchase_value列的空值用该用户之前最近的非空值填充(即向前填充),但你的尝试代码存在两个关键问题:

  • 列名不匹配:原数据列是purchase_value,代码里误写为purchase_amount
  • 未保证组内数据顺序:groupby的sort=True仅对分组键排序,不会确保组内记录按日期先后排列,这会导致填充逻辑混乱

正确实现步骤

  1. 先按user_id和date正序排序,保证每个用户的记录按时间顺序排列
  2. 按user_id分组后,对purchase_value列执行向前填充(ffill)
  3. 将填充结果赋值回原列或生成新列

代码示例

# 1. 按用户和日期正序排序,确保填充逻辑基于时间顺序
df_sorted = df.sort_values(by=['user_id', 'date'])

# 2. 分组执行向前填充
df_sorted['purchase_value'] = df_sorted.groupby('user_id')['purchase_value'].ffill()

# 查看最终结果
print(df_sorted)

效果验证

运行上述代码后,会得到你预期的结果:

date       | user_id | purchase_value
2020-01-01 | 1       | null
2020-01-02 | 1       | 1
2020-01-03 | 1       | 1
2020-01-04 | 1       | 4
2020-01-01 | 2       | 55
2020-01-02 | 2       | 55

补充说明

如果需要保留原始数据的行顺序,可以通过临时索引实现:

# 记录原始索引
df['original_idx'] = df.index
# 按用户和日期排序
df_sorted = df.sort_values(by=['user_id', 'date'])
# 执行填充
df_sorted['purchase_value'] = df_sorted.groupby('user_id')['purchase_value'].ffill()
# 恢复原始顺序并清理临时列
df_result = df_sorted.sort_values('original_idx').drop('original_idx', axis=1)

内容的提问来源于stack exchange,提问作者titutubs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:39:22