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('')
运行这段代码后,你会得到符合预期的结果:
| A1 | A2 | avg |
|---|---|---|
| 10 | 10.0 | |
| 110 | 110.0 | |
| 12 | 120 | 66.0 |
关键总结
- 空字符串会让列类型变成
object,被numeric_only=True过滤; - 必须先将空字符串转为数值类型的缺失值(NaN),让列成为数值类型,才能让均值函数正确忽略缺失值计算;
pd.to_numeric(errors='coerce')是处理这类混合类型数据的常用方法,它会把无法转为数值的内容(比如空字符串)转为NaN。
内容的提问来源于stack exchange,提问作者Gonzalo
相关产品推荐
相关产品推荐

