如何基于Pandas DataFrame同姓名对应已有Email填充NaN值?
解决方案
方法1:分组取组内非空值填充
你可以按Name分组,对每个组的Email列用transform方法,用组内的有效邮箱填充所有NaN值:
df['Email'] = df.groupby('Name')['Email'].transform(lambda x: x.fillna(x.dropna().iloc[0]))
逻辑是:对每个用户组,先筛选出非空的邮箱(x.dropna()),取第一个有效值(iloc[0]),再用这个值覆盖组内所有NaN。
方法2:双向填充(适配更多场景)
如果你的数据中NaN可能出现在组内任意位置(比如有的组非空值在前面,有的在后面),可以用双向填充的方式:
df['Email'] = df.groupby('Name')['Email'].transform(lambda x: x.bfill().ffill())
bfill()先向后填充(用后面的非空值填前面的NaN),ffill()再向前填充(用前面的非空值填后面的NaN),确保组内所有位置都能被正确填充。
你的原有代码无效的原因
pd.np.where((df['Name']==df['Name']), df['Email'], '0')里,df['Name']==df['Name']永远为True,这个语句等价于直接返回原Email列,自然不会修改任何NaN值。
在Stack Overflow中正确展示内容的方法
- 代码块:用三个反引号(```)包裹代码,开头指定语言(比如
python)可触发语法高亮:import pandas as pd import numpy as np # 你的代码内容 - DataFrame输出:把
print(df)的结果用```text包裹,保留原格式:Name Email 0 James Martin NaN 1 James Martin jm@so.com - 问题描述:清晰分点说明需求、尝试过的代码、预期结果,方便其他开发者快速理解你的问题。
内容的提问来源于stack exchange,提问作者shobiwankenobi
相关产品推荐
相关产品推荐

