如何用对应列非NaN值填充Pandas DataFrame的object类型空值?
解决Pandas中Object类型列用列内非NaN值填充空值的问题
先明确你的核心需求:针对DataFrame里的object类型列,用该列中存在的有效非NaN值填充所有空值。你的尝试代码里直接用df[col][0]存在取到NaN的风险,下面给你一套可靠的解决方案。
分析你的场景
从你的示例数据和期望输出来看:
company列仅第1行有非空值coca-cola,需要把整列的NaN都替换为这个值product列第1行是NaN,需要用列内的首个非空值coca填充,其他已有值保留不变
可行解决方案
我们可以先筛选出所有object类型的列,然后对每一列先获取有效非空值(优先取首个非NaN值,或根据需求取众数),再用这个值填充列内的空值。
方法1:用列内首个非NaN值填充
import pandas as pd import numpy as np # 你的原始数据 data = {'product': ['coca', np.nan, 'pepsi', 'pepsi', 'orange'], 'price': [25, 94, 57, 62, 70], 'company':[np.nan,'coca-cola',np.nan,np.nan,np.nan]} df = pd.DataFrame(data) # 遍历处理所有object类型列 for col in df.columns: if df[col].dtype == 'object': # 先过滤掉NaN,取第一个有效非空值 fill_value = df[col].dropna().iloc[0] # 注意:必须赋值回原列,否则不会修改原DataFrame(你的原代码就是漏了这一步!) df[col] = df[col].fillna(fill_value) print(df)
输出结果:
company price product 0 coca-cola 25 coca 1 coca-cola 94 coca 2 coca-cola 57 pepsi 3 coca-cola 62 pepsi 4 coca-cola 70 orange
关键细节补充
- 原代码未生效的原因:你调用
df[col].fillna(...)后没有将结果赋值回df[col],Pandas的多数方法会返回新对象,不会直接修改原DataFrame,赋值操作是必须的。 - 如何避免取到NaN:用
df[col].dropna().iloc[0]可以先剔除列内的NaN,再取第一个有效非空值,彻底规避取到NaN的风险(如果担心列全是NaN,可以额外加个判断:if not df[col].dropna().empty)。 - 如果列有多个不同非空值:如果你的场景中,某个object列有多个不同的非空值,想统一用出现次数最多的那个填充,可以把获取填充值的代码改成:
fill_value = df[col].mode()[0]
内容的提问来源于stack exchange,提问作者rosefun
相关产品推荐
相关产品推荐

