首页 > 解决方案 > Pands - 错误:数字列上的“没有要聚合的数字类型”

问题描述

我正在尝试按字符串列 ( b) 对数据框进行分组,并在另一列 () 上获取平均值a。这样做时,我得到一个我目前不明白的错误。

import pandas as pd

df = pd.DataFrame({
    1 : {'a':10,'b':'string1'},
    2 : {'a':20,'b':'string1'},
    3 : {'a':30,'b':'string1'},
    4 : {'a':1,'b':'string2'}
}).T
df.groupby('b')['a'].mean()

我得到了错误:

DataError: No numeric types to aggregate

我已经尝试通过“手”聚合并且它有效,所以我不明白这里的熊猫问题是什么

df_agg = {}

for g in df_grouped.groups:
  df_agg[g] = df_grouped.get_group(g)['a'].mean()\
df_agg 

返回: {'string1': 20.0, 'string2': 1.0}如我所愿。

标签: pythonpandasdataframe

解决方案


您收到错误是因为both columns are object type.

<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 1 to 4
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   a       4 non-null      object
 1   b       4 non-null      object
dtypes: object(2)
memory usage: 96.0+ bytes

解决方案

我们需要将其转换column a为 int 以使其变为numeric type然后对其应用均值。

df.a = df.a.astype(int)
df = df.groupby('b', as_index=False).mean()

输出

    b       a
0   string1 20
1   string2 1

来自熊猫文档

注意:任何对象列,如果它包含数值,例如小数对象,则被视为“讨厌”列。它们在 groupby 中自动从聚合函数中排除。
如果您确实希望在具有其他非有害数据类型的聚合中包含十进制或对象列,则必须明确地这样做。


推荐阅读