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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:17:23