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

Pandas mean函数返回全NaN问题咨询

问题根源与解决方案

这个问题的核心在于空字符串('')导致列数据类型变为object,而numeric_only=True会过滤掉非数值类型的列,最终没有可用的数值列来计算行均值,所以返回全NaN。咱们一步步理清楚:

为什么第一个例子能正常工作?

你提到第一个例子用df['avg'] = df[['A1','A2']].mean(axis=1, numeric_only=True)得到了正确结果,这其实是因为第一个例子里的A1列全是整数(数据类型为int64,属于数值类型),numeric_only=True会保留这个列参与计算。至于A2列的空字符串能被忽略,大概率是你实际代码里把空字符串替换成了pd.NA或np.nan(而非原生空字符串)——这种情况下A2列会变成float64类型(因为NaN是浮点型),同样被numeric_only=True纳入计算,均值函数会自动跳过NaN值。

第二个例子为什么全是NaN?

当你的DataFrame里A1和A2列都混合了空字符串和数值时,这两列的数据类型会被自动设为object(混合类型)。而numeric_only=True的作用是只保留数据类型为数值(int、float、bool)的列,这时候两个列都被过滤掉了,没有可用的列来计算行均值,自然所有结果都是NaN。

正确的解决方案

要解决这个问题,我们需要先把空字符串转换为数值类型的缺失值(NaN),同时将列转为数值类型,之后再计算均值:

import pandas as pd

# 初始化你的DataFrame
df = pd.DataFrame([{'A1':10, 'A2':''}, {'A1':'','A2':110}, {'A1':12,'A2':120}])

# 第一步:把空字符串转为NaN,同时将列转为数值类型
df[['A1', 'A2']] = df[['A1', 'A2']].apply(pd.to_numeric, errors='coerce')

# 第二步:计算行均值(此时列都是数值类型,numeric_only=True可以省略)
df['avg'] = df[['A1', 'A2']].mean(axis=1)

# 可选:把NaN转回空字符串用于展示
df[['A1', 'A2']] = df[['A1', 'A2']].fillna('')

运行这段代码后,你会得到符合预期的结果:

A1A2avg
1010.0
110110.0
1212066.0

关键总结

  • 空字符串会让列类型变成object,被numeric_only=True过滤;
  • 必须先将空字符串转为数值类型的缺失值(NaN),让列成为数值类型,才能让均值函数正确忽略缺失值计算;
  • pd.to_numeric(errors='coerce')是处理这类混合类型数据的常用方法,它会把无法转为数值的内容(比如空字符串)转为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:52:45