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

Pandas mean()函数报错解析:替换非数值为NaN后为何无法计算均值

问题原因分析与差异说明

1. 原代码报错的核心原因

当你用混合数字与字符串的列表创建numpy数组时,numpy会自动将整个数组的 dtype 统一为字符串类型(numpy数组要求所有元素类型一致,字符串是能同时容纳数字和字符的兼容类型)。此时原本的数字1.、2.等都被转换成了字符串形式,比如"1.0"。

后续生成DataFrame后,列的 dtype 为object(存储字符串与np.nan的混合类型)。调用mean()时,pandas会尝试对列内元素执行加法运算,但字符串与np.nan(本质是float类型)无法相加,因此触发TypeError。

2. 直接填入NaN能正常运行的缘由

如果一开始就在数据列表中填入np.nan,numpy会识别到列表包含float类型(np.nan属于float),因此将整个数组的 dtype 设置为float64。此时创建的DataFrame列是数值类型,mean()函数可以自动忽略np.nan,正常计算均值。

验证与修复方案

验证类型差异

通过打印 dtype 可以直观看到两种情况的区别:

# 原代码的numpy数组类型
data = [ 1. ,'a', 2. , 4. , 'b', 3. , 5. , 6. , 'c', 6. , 2. , 'a', 3. , 'a', 7. , 'b']
np_array = np.array(data).reshape(4,4)
print(np_array.dtype)  # 输出:<U32(字符串类型)

# 直接填入NaN的numpy数组类型
data_with_nan = [1., np.nan, 2., 4., np.nan, 3., 5., 6., np.nan, 6., 2., np.nan, 3., np.nan, 7., np.nan]
np_array_nan = np.array(data_with_nan).reshape(4,4)
print(np_array_nan.dtype)  # 输出:float64(数值类型)

修复原代码的方法

需要将替换后的列转换为数值类型,可使用pd.to_numeric():

import numpy as np
import pandas as pd

data = [ 1. ,'a', 2. , 4. , 'b', 3. , 5. , 6. , 'c', 6. , 2. , 'a', 3. , 'a', 7. , 'b']
np_array = np.array(data).reshape(4,4)
df = pd.DataFrame(np_array.reshape(4,4))

# 替换后转换为数值类型,无法转换的设为NaN
df = df.replace({"a":np.nan, "b":np.nan, "c":np.nan})
df = df.apply(pd.to_numeric, errors='coerce')

mean_value = df[1].mean()
print(mean_value)  # 正常输出:4.333333333333333

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:02:24