Pandas按A列分组将B列nan与0替换为同组对应有效值
原有代码问题
df['B'].fillna(0)未将返回值赋值回原列,不会对原DataFrame产生任何修改- 分组时引用了不存在的列
$LINK:NO,且调用size()方法是统计分组内的行数,并非提取分组下B列的有效值 - 筛选条件
B > 0未绑定DataFrame对象,会直接触发名称错误
正确实现代码
以下代码完全匹配你的需求,默认每个A分组下存在唯一的非0、非空B有效值(和你给出的示例场景一致):
推荐写法:分组广播填充
用groupby+transform直接将分组有效值广播到同组所有行,代码最简洁:
import pandas as pd import numpy as np # 示例数据构造(使用自己的真实数据时可跳过这段) df = pd.DataFrame({ 'A': [111, 111, 112, 112, 113, 113, 114, 114], 'B': [4, 4, 0, 2, 3, 3, np.nan, 1] }) # 核心逻辑:按A分组,取每组非0非空的B值,填充整组 df['B'] = df.groupby('A')['B'].transform( lambda col: col[(col.notna()) & (col != 0)].iloc[0] )
运行后输出结果和你给出的预期完全一致。
替代写法:映射替换
先提取每个A对应的有效B值生成映射字典,再做值替换,逻辑更直白:
# 生成A列到有效B值的映射 valid_mapping = df[df['B'].notna() & (df['B'] != 0)]\ .drop_duplicates('A')\ .set_index('A')['B']\ .to_dict() # 按映射替换B列 df['B'] = df['A'].map(valid_mapping)
如果你的实际数据中存在同个A分组下有多个不同非0非空B值的情况,需要调整取值规则,比如取最大值、第一个值、平均值等,适配自己的业务需求即可。
内容的提问来源于stack exchange,提问作者Kimchi
相关产品推荐
相关产品推荐

