如何以B列为参考,用同值其他行的有效值替换DataFrame的NaN值
实现方案
你可以按B列分组提取每组A列的有效值生成映射,再填充原A列的空值即可,有两种简洁的实现方式:
方式1:transform一步填充(最简洁)
利用groupby+transform直接对A列的空值做同组有效值填充,代码如下:
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({ 'A': [1, np.nan, 1, np.nan, np.nan, 5, 1, 2], 'B': [1, 3, 1, 1, 2, 3, 1, 2] }) # 核心填充逻辑,同一B值对应的A有效值唯一时可直接用first() df['A'] = df['A'].fillna(df.groupby('B')['A'].transform('first'))
如果同组A可能存在多个有效值、需要按顺序前后填充的,可以替换为:
df['A'] = df.groupby('B')['A'].transform(lambda x: x.ffill().bfill())
方式2:先构建映射表再合并填充
如果你习惯用合并的方式实现,可以先聚合得到每个B对应的有效A值,再左连接回原表替换空值:
# 构建B到有效A的映射表 map_df = df.groupby('B')['A'].first().reset_index(name='valid_A') # 合并后替换空值,再删除多余列 df = df.merge(map_df, on='B', how='left') df['A'] = df['A'].fillna(df['valid_A']) df = df.drop('valid_A', axis=1)
原代码错误原因
你之前的写法b=a.groupby('B').reset_index()没有对A列做聚合取值,groupby后直接reset_index得到的并不是B和有效A的映射表,所以合并后无法得到预期结果。
运行上述代码后得到的结果和你预期的一致:
A B 0 1.0 1 1 5.0 3 2 1.0 1 3 1.0 1 4 2.0 2 5 5.0 3 6 1.0 1 7 2.0 2
内容的提问来源于stack exchange,提问作者sopL
相关产品推荐
相关产品推荐

