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

如何基于DataFrame中其他有效值填充含NaN的列?附代码片段

解决DataFrame列内NaN填充问题

嘿,我来帮你搞定这个DataFrame填充NaN的问题!首先先理清楚你的需求:你想用col1、col2、col3这三列里的有效值,填充这三列中的NaN值。先把你的原始数据整理成清晰的表格:

col1col2col3col4
nan124
2223
3nan12

改进你的现有循环代码

你的初始思路是对的,但有几个小细节需要修正:比如列表推导式里的变量名重复、判断NaN的方式不够严谨,还有循环变量不匹配的问题。我帮你修正并完善了代码,直接可以运行:

import pandas as pd
import numpy as np

# 先构造你的目标DataFrame
df = pd.DataFrame({
    'col1': [np.nan, 2, 3],
    'col2': [1, 2, np.nan],
    'col3': [2, 2, 1],
    'col4': [4, 3, 2]
})

# 遍历每一行,处理NaN填充
for idx, row in df.iterrows():
    # 提取当前行需要处理的三列
    target_cols = row[['col1', 'col2', 'col3']]
    # 获取该行的有效值(过滤掉NaN)
    valid_vals = target_cols.dropna().values
    # 如果有有效值,就用均值填充NaN(你也可以换成第一个有效值、众数等)
    if len(valid_vals) > 0:
        fill_val = valid_vals.mean()  # 替换成valid_vals[0]可取第一个有效值
        df.loc[idx, ['col1', 'col2', 'col3']] = target_cols.fillna(fill_val)

# 输出结果
print(df)

运行后得到的结果:

col1  col2  col3  col4
0   1.5   1.0   2.0     4
1   2.0   2.0   2.0     3
2   3.0   2.0   1.0     2

更高效的Pandas内置方法

如果你的数据集比较大,循环的效率会很低,推荐用Pandas的内置方法,一行代码就能完成需求,性能提升很多:

# 用每行的有效值均值填充NaN
df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply(
    lambda x: x.fillna(x.mean()), axis=1
)

# 如果你想取第一个有效值填充(而不是均值),可以用这段代码:
# df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply(
#     lambda x: x.fillna(x.dropna().iloc[0] if not x.dropna().empty else np.nan), axis=1
# )

代码解释

  • axis=1 指定逐行处理,而不是默认的逐列
  • x.mean() 计算当前行三列的有效值均值,用来填充该行的NaN
  • 如果某一行三个值全是NaN(你的数据里没有这种情况),可以保留NaN或者自定义填充值

内容的提问来源于stack exchange,提问作者Piyush S. Wanare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:37