Pandas TypeError:无法转换为数字

Tom*_*ori 13 python group-by numpy dataframe pandas

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

示例数据框:

  ProductSKU OverallHeight
0   AAI2185           74.5
1   AAI2275             47
2   AAI2686           56.5
3  AASA1002          73.23
Run Code Online (Sandbox Code Playgroud)

函数调用:

avgValue = df["OverallHeight"].dropna().mean()             <--- Breaks here
Run Code Online (Sandbox Code Playgroud)

控制台输出:

    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
Run Code Online (Sandbox Code Playgroud)

最奇怪的是,当我通过 CSV 导入相同的数据时,它运行得非常好。只有当我通过 SQL 加载它时它才会中断,是否有什么地方我做错了?

cot*_*ail 18

如果您在 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
Run Code Online (Sandbox Code Playgroud)


Gon*_*ica 0

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

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

print(df['OverallHeight-ToptoBottom'].dtype) 
Run Code Online (Sandbox Code Playgroud)

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

df["OverallHeight-ToptoBottom"] = pd.to_numeric(df["OverallHeight-ToptoBottom"], downcast="float")
Run Code Online (Sandbox Code Playgroud)