我正在做一个项目,我将数据从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加载它时,它才会中断,可能是我做错了什么吗?
4条答案
按热度按时间hl0ma9xz1#
如果你在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
。一个例子,说明了问题和解决方案。
字符串
cnh2zyt32#
正如控制台输出所显示的,框架列
'OverallHeight-ToptoBottom'
存在问题。正如@Warren Weckesser评论的那样,我的猜测是列包含字符串。
字符串
假设上述情况为真,将列数据类型转换为float应该可以解决问题。
型
vjrehmav3#
这将有助于将obj转换为float类型。
df 'column_name'] = pd.to_numeric(df 'column_name'],errors='coerce')
cgh8pdjw4#
很可能ToptoBottom的内容被作为字符串读取。如果你用Python的读取模式打开一个文件,并根据新行和逗号分割字符串,数字被转换为字符串,这就是为什么panda不能读取数据或将其用作平均值。因此你会得到错误:
字符串
要消除转换问题,您希望将其转换为数值,可以使用pandas to_numeric()函数