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

jmo0nnb3  于 2023-08-01  发布在  其他
关注(0)|答案(3)|浏览(1116)

我正在做一个项目,我将数据从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加载它时它才中断,会不会是我做错了什么?

b1zrtrql

b1zrtrql1#

如果在groupby操作后出现类似的TypeError(例如TypeError: Could not convert ace to numeric),那么你可能有pandas>=2.0。
groupby.mean()numeric_only=参数在过去默认值为True,但从pandas 2.0开始,其默认值为False。这意味着当在groupby对象上调用meanstd之类的统计方法时,字符串列不会被删除(和过去一样)。要解决此问题,请传递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

字符串

5lwkijsr

5lwkijsr2#

正如控制台输出显示的那样,dataframe列'OverallHeight-ToptoBottom'存在问题。
正如@Warren Weckesser评论的那样,我的猜测是这些列包含字符串。为了检查该列的数据类型,请运行

print(df['OverallHeight-ToptoBottom'].dtype)

字符串
假设上述情况成立,将列数据类型转换为float应该可以解决问题。使用pandas.to_numeric

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

fcg9iug3

fcg9iug33#

ToptoBottom的内容很有可能被读取为字符串。如果你用Python读取模式打开一个文件,并根据新的行和逗号拆分字符串,数字将转换为字符串,这就是为什么panda不能读取数据或将其用作平均值。因此,你会得到错误:

TypeError: Could not convert 74.54756.573.23 to numeric

字符串
要消除转换问题,如果要将其转换为数值,可以使用pandas to_numeric()函数

相关问题