熊猫groupby抛出ValueError

时间:2020-09-24 05:13:36

标签: pandas

Category    Data    Age     Location
A            30     44      212 Street
A            20     54      212 Street
A            20     48      212 Street
A            10     49      209 Street
A            40     12      209 Street
A            30     21      209 Street
A            30     32      220 Street
A            35     24      220 Street
A            25     22      220 Street

这是我的熊猫df的一部分。我希望将Ober类别和汇总数据分组,并在列表中保留唯一位置

df.groupby(['Category']).agg({'Location': pd.Series.unique, 'Data': 'sum'})
This is throwing value error for Location.
ValueError: Function does not reduce

我在做什么错?我想在“分组依据”列中放置唯一的位置。

2 个答案:

答案 0 :(得分:2)

您可以将唯一值转换为list,因为在您的解决方案中而不转换为list会得到相同的错误:

ValueError:必须产生汇总值

#your solution should be changed with convert to list
df1 = df.groupby(['Category']).agg({'Location': lambda x: list(pd.Series.unique(x)), 
                                    'Data': 'sum'})

或者:

df1 = df.groupby(['Category']).agg({'Location': lambda x: list(x.unique()), 'Data': 'sum'})
print (df1)
                                      Location  Data
Category                                            
A         [212 Street, 209 Street, 220 Street]   240

但是如果不需要列表,请添加DataFrame.explode

df1 = (df.groupby(['Category'])
         .agg({'Location': lambda x: list(x.unique()), 'Data': 'sum'})
         .explode('Location'))
print (df1)
            Location  Data
Category                  
A         212 Street   240
A         209 Street   240
A         220 Street   240

或与DataFrame.drop_duplicatesDataFrame.join一起使用解决方案:

s = df.groupby(['Category'])['Data'].sum()
print (s)
Category
A    240
Name: Data, dtype: int64

df1 = df.drop_duplicates(['Category','Location']).drop('Data',axis=1).join(s, on='Category')
print (df1)
  Category  Age    Location  Data
0        A   44  212 Street   240
3        A   49  209 Street   240
6        A   32  220 Street   240

答案 1 :(得分:1)

您可以将set数据结构用于唯一元素

df.groupby(['Category']).agg({'Location': set, 'Data': 'sum'})

                                      Location  Data
Category                                            
A         {220 Street, 209 Street, 212 Street}   240

在您的代码中,问题在于您将pd.Series.unique作为聚合函数。该函数不接受任何输入,而是类Series的函数。因此,就像@jezrael提到的那样,lambda x: list(x.unique())之所以有效是因为xSeries,并且由于熊猫不接受list作为ndarray的输出而被转换为open()。聚合函数。