numpy Pandas TypeError:无法转换为数字

woobm2wo  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(614)

我正在做一个项目,我将数据从SQL导入到pandas DataFrame中。这似乎进行得很顺利,但是当我使用pandas.mean()时,它抛出了一个TypeError,说明值的串联列表不能转换为数值(见下文):
示例数据框架:

ProductSKU OverallHeight
0   AAI2185           74.5
1   AAI2275             47
2   AAI2686           56.5
3  AASA1002          73.23

字符串
函数调用:

avgValue = df["OverallHeight"].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加载它时,它才会中断,可能是我做错了什么吗?

hl0ma9xz

hl0ma9xz1#

如果你在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

字符串

cnh2zyt3

cnh2zyt32#

正如控制台输出所显示的,框架列'OverallHeight-ToptoBottom'存在问题。
正如@Warren Weckesser评论的那样,我的猜测是列包含字符串。

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

字符串
假设上述情况为真,将列数据类型转换为float应该可以解决问题。

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

vjrehmav

vjrehmav3#

这将有助于将obj转换为float类型。
df 'column_name'] = pd.to_numeric(df 'column_name'],errors='coerce')

cgh8pdjw

cgh8pdjw4#

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

TypeError: Could not convert 74.54756.573.23 to numeric

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

相关问题