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
相关产品推荐
相关产品推荐

