Pandas.mean() TypeError:无法转换为数字

问题描述 投票:0回答:4

我正在开发一个项目,将数据从 SQL 导入到 pandas DataFrame 中。这似乎很顺利,但是当我使用 pandas.mean() 时,它会抛出一个 TypeError ,指出串联的值列表无法转换为数字(见下文):

示例数据框:

df =
  ProductSKU OverallHeight-ToptoBottom
0   AAI2185                      74.5
1   AAI2275                        47
2   AAI2686                      56.5
3  AASA1002                     73.23

函数调用:

avgValue = df["OverallHeight-ToptoBottom"].dropna().mean()             <--- Breaks here

控制台输出:

    Traceback (most recent call last):

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\generic.py", line 5310, in stat_func
    numeric_only=numeric_only)

  ... 

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\nanops.py", line 293, in nanmean
    the_sum = _ensure_numeric(values.sum(axis, dtype=dtype_sum))

  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\nanops.py", line 743, in _ensure_numeric
    raise TypeError('Could not convert %s to numeric' % str(x))

TypeError: Could not convert 74.54756.573.23 to numeric

最奇怪的事情(也是我无法弄清楚的)是,当我通过 CSV 导入相同的数据时,它工作得非常好。只有当我通过 SQL 加载它时它才会中断,可能是我做错了什么?

python pandas dataframe numpy mean
4个回答
4
投票

如果您在 groupby 操作后遇到类似的 TypeError(例如

TypeError: Could not convert ace to numeric
),那么您可能拥有 pandas>=2.0。

groupby.mean()
numeric_only=
参数,过去默认值为 True,但从 pandas 2.0 开始,其默认值为 False。这意味着当在 groupby 对象上调用诸如
mean
std
之类的统计方法时,字符串列不会被删除(就像过去所做的那样)。要解决问题,请通过
numeric_only=True

显示问题和解决方案的示例。

import pandas as pd
df = pd.DataFrame({
    "Grouper": ["A", "B", "A", "B", "A"],
    "Name": ["a", "b", "c", "d", "e"],
    "Value": [0.95, 0.25, 0.25, 0.10, 1.00]
})

grouped = df.groupby("Grouper").mean()                    # <---- TypeError: Could not convert ace to numeric

grouped = df.groupby("Grouper").mean(numeric_only=True)   # <---- OK

1
投票

正如控制台输出所示,数据框列存在问题

'OverallHeight-ToptoBottom'

我的猜测,正如@Warren Weckesser 评论的那样,这些列包含字符串。为了检查该列运行的数据类型

print(df['OverallHeight-ToptoBottom'].dtype)
假设上述情况成立,将列数据类型转换为 float 应该可以解决问题。为此用途

pandas.to_numeric


df["OverallHeight-ToptoBottom"] = pd.to_numeric(df["OverallHeight-ToptoBottom"], downcast="float")
    

0
投票
这将有助于将 obj 转换为 float 类型。

df['列名'] = pd.to_numeric(df['列名'], 错误='强制')


-1
投票
ToptoBottom 的内容很可能被作为字符串读取。如果您使用 python 读取模式打开文件,并根据换行符和逗号分割字符串,则数字将转换为字符串,这就是 panda 无法读取数据或将其用作平均值的原因。因此你会得到错误:

TypeError: Could not convert 74.54756.573.23 to numeric
要解决转换问题,你想将其转换为数值,可以使用 pandas to_numeric() 函数

© www.soinside.com 2019 - 2024. All rights reserved.