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

如何用行均值填充DataFrame的NaN,同时保留首列字符串行名?

用每行均值填充DataFrame中的NaN值(排除字符串列)

问题场景

原始DataFrame结构如下,其中Country列为字符串类型,年份列是数值型,存在NaN值:

Index    Country   1990 1995 2000 2005 2010 2015 
 0         US       5    6    NaN  9    19   11
 1        Germany   5    NaN  3    7    19    9
 .         ...      ..    ..   ..  ..   ..   ..
 ,         ...      ..    ..   ..  ..   ..   ..

需求:用每行数值列的均值填充该行的NaN值,但直接按行计算均值会被Country列的字符串干扰,之前尝试的代码df.fillna(df.drop['country'] , axis=1).apply(lambda x: x.mean() ,axis=1)未生效。


错误原因分析

  1. df.drop['country']写法错误:drop是方法,需用括号调用,且要指定轴axis=1(删除列),正确写法为df.drop('Country', axis=1)
  2. 逻辑错误:fillna需要接收与原DataFrame匹配的填充值序列,直接传入数值列DataFrame无法对应每行的均值进行填充

正确解法

方法1:逐行处理(简洁直观)

对每行单独处理,先剔除字符串列计算均值,再填充该行的NaN:

df = df.apply(lambda row: row.fillna(row.drop('Country').mean()), axis=1)
  • row.drop('Country'):移除当前行的字符串列,仅保留数值列
  • row.drop('Country').mean():计算当前行数值列的均值(自动跳过NaN)
  • row.fillna(...):用该行均值填充当前行的所有NaN值

方法2:先计算每行均值再批量填充

先提取数值列计算每行均值,再针对性填充数值列的NaN:

# 计算每行数值列的均值(排除Country列)
row_means = df.drop('Country', axis=1).mean(axis=1)

# 仅对年份数值列进行填充
df.loc[:, '1990':'2015'] = df.loc[:, '1990':'2015'].fillna(row_means, axis=0)

这种方式更适合大数据集,性能比apply逐行处理更优。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:07:20