我正在开发一个项目,将数据从 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 加载它时它才会中断,可能是我做错了什么?
如果您在 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
正如控制台输出所示,数据框列存在问题
'OverallHeight-ToptoBottom'
。
我的猜测,正如@Warren Weckesser 评论的那样,这些列包含字符串。为了检查该列运行的数据类型
print(df['OverallHeight-ToptoBottom'].dtype)
假设上述情况成立,将列数据类型转换为 float 应该可以解决问题。为此用途
df["OverallHeight-ToptoBottom"] = pd.to_numeric(df["OverallHeight-ToptoBottom"], downcast="float")
df['列名'] = pd.to_numeric(df['列名'], 错误='强制')
TypeError: Could not convert 74.54756.573.23 to numeric
要解决转换问题,你想将其转换为数值,可以使用 pandas to_numeric() 函数