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
我在做什么错?我想在“分组依据”列中放置唯一的位置。
答案 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_duplicates
和DataFrame.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())
之所以有效是因为x
是Series
,并且由于熊猫不接受list
作为ndarray
的输出而被转换为open()
。聚合函数。