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

Pandas分组后获取上一组值:实现新增列填充需求

解决方案:跨组填充前一组的有效值到新列

你的需求是按列a分组后,将上一组的b列非空值填充到当前组的新列c,组内的ffill因为仅在组内生效,所以无法满足跨组填充的要求。下面是两种可行的实现方式:

方法一:基于组的有效值映射

核心思路是先提取每个组的b列有效非空值,再创建「当前组→前一组有效值」的映射,最后通过映射给c列赋值:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':['a','a','b','b','c','c'],'b':[1,1,np.nan,np.nan,1,1]})

# 提取每个组的b列第一个非空值(同组内b值一致,取第一个即可)
group_b_values = df.groupby('a')['b'].first().dropna()
# 生成前一组值的映射:shift()将有效值向后偏移一组,对应到下一个组
prev_group_map = group_b_values.shift().to_dict()
# 给c列赋值
df['c'] = df['a'].map(prev_group_map)

print(df)

运行后输出与期望结果完全一致:

a    b    c
0  a  1.0  NaN
1  a  1.0  NaN
2  b  NaN  1.0
3  b  NaN  1.0
4  c  1.0  NaN
5  c  1.0  NaN

方法二:标记组边界后跨组填充

通过给每个组分配唯一编号,再基于编号实现跨组的有效值映射:

# 给每个组分配组编号
df['group_id'] = df['a'].factorize()[0]
# 提取每个组的b列有效值,与组编号对应
group_b = df.drop_duplicates('group_id')[['group_id', 'b']].dropna()
# 建立组编号与前一组b值的映射
prev_b_map = group_b.set_index('group_id')['b'].shift().to_dict()
# 给c列赋值
df['c'] = df['group_id'].map(prev_b_map)
# 清理临时的group_id列
df = df.drop('group_id', axis=1)

这种方法逻辑和第一种一致,只是通过组编号完成映射,最终结果相同。

补充:为什么组内ffill无效?

df.groupby('a')['b'].ffill()的作用范围被限制在单个组内部,只会填充当前组内的缺失值,不会跨组读取其他组的有效值,因此无法为b组(全为NaN)填充前一个a组的1.0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:05:08