如何用行均值填充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)未生效。
错误原因分析
df.drop['country']写法错误:drop是方法,需用括号调用,且要指定轴axis=1(删除列),正确写法为df.drop('Country', axis=1)- 逻辑错误:
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
相关产品推荐
相关产品推荐

