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

如何按分组替换Pandas DataFrame中的nan值(fillna分组填充)

如何按分组替换DataFrame中的'nan'字符串?

你遇到的问题很典型——直接遍历DataFrame的values修改副本不会影响原数据,所以之前的循环方法才没生效。下面给你两种实用的解决方案,根据你的需求选就行:

方案一:手动指定每个分组的替换值

如果你已经明确知道每个group对应的替换内容,比如Climatological组的'nan'要换成'Drought',可以先定义一个映射字典,再用loc定位修改:

# 先初始化你的DataFrame
import pandas as pd
data_pd = pd.DataFrame({'type':['Drought','nan','Explosion','Ground movement','nan','Ash fall','Rockfall','Ash fall','nan','Explosion','nan'], 'group':['Climatological','Climatological','Technological','Geophysical','Geophysical', 'Geophysical','Geophysical','Geophysical','Technological','Technological','Meteorological']})

# 定义每个分组对应的替换值
replace_map = {
    'Climatological': 'Drought',
    'Geophysical': 'Ground movement',  # 你可以改成该组的其他值,比如'Ash fall'
    'Technological': 'Explosion',
    'Meteorological': 'Meteorological Event'  # 自定义该组的替换内容
}

# 定位type为'nan'的行,根据group匹配替换值
data_pd.loc[data_pd['type'] == 'nan', 'type'] = data_pd.loc[data_pd['type'] == 'nan', 'group'].map(replace_map)

方案二:自动用分组内最常见的type值替换

如果想让程序自动取每个group里出现次数最多的type值来替换'nan'(更通用),可以先计算每个分组的众数,再映射替换:

# 计算每个group中type的众数(排除'nan')
group_mode = data_pd[data_pd['type'] != 'nan'].groupby('group')['type'].agg(lambda x: x.mode()[0])

# 替换所有'nan'
data_pd.loc[data_pd['type'] == 'nan', 'type'] = data_pd.loc[data_pd['type'] == 'nan', 'group'].map(group_mode)

为什么你的原方法无效?

你之前用zip(data_pd['type'].values, ...)遍历得到的是每个元素的副本,修改ty变量只是修改了这个副本,根本不会影响原DataFrame里的数据。Pandas的设计更适合用向量化操作(比如loc、map)来直接操作数据,而不是用Python循环逐个修改。

内容的提问来源于stack exchange,提问作者me.limes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:57:32