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

如何用对应列非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

关键细节补充

  1. 原代码未生效的原因:你调用df[col].fillna(...)后没有将结果赋值回df[col],Pandas的多数方法会返回新对象,不会直接修改原DataFrame,赋值操作是必须的。
  2. 如何避免取到NaN:用df[col].dropna().iloc[0]可以先剔除列内的NaN,再取第一个有效非空值,彻底规避取到NaN的风险(如果担心列全是NaN,可以额外加个判断:if not df[col].dropna().empty)。
  3. 如果列有多个不同非空值:如果你的场景中,某个object列有多个不同的非空值,想统一用出现次数最多的那个填充,可以把获取填充值的代码改成:
fill_value = df[col].mode()[0]

内容的提问来源于stack exchange,提问作者rosefun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:01