我有一个df:
df = pd.DataFrame({'type':['a', 'a', 'b', 'b'],
'id':[1134, 5321, 2444, 2444],
'amt':[45, 55, 13, 14]})
我正在尝试获取amt列的计数,总和,均值和唯一ID。
df.groupby('type')['amt'].agg(['count', 'sum', np.mean])
count sum mean
type
a 2 100 50.0
b 2 27 13.5
现在,我正在尝试为每个分组获取不同的ID。如果我将id
添加到要拉出的列中,则会产生
id amt
count sum mean count sum mean
type
a 2 6455 3227.5 2 100 50.0
b 2 4888 2444.0 2 27 13.5
我不想要。我想要第一个表,但具有另一个列的数量。我也尝试了以下方法,但无济于事。
df.groupby('type')['amt'].agg(['count', 'sum', np.mean, lambda x: len(np.unique(x['id']))])
预期输出:
count sum mean unique_id
type
a 2 100 50.0 2
b 2 27 13.5 1
答案 0 :(得分:5)
将agg
与nunique
一起使用。您不必强迫将列表传递给agg
,它也需要字典映射,这就是这里所需要的。
res = df.groupby('type').agg({'amt': ['count', 'sum', 'mean'], 'id': 'nunique'})
amt id
count sum mean nunique
type
a 2 100 50.0 2
b 2 27 13.5 1
如果您想平整列(我个人认为您应该保留它们,以便于索引编制):
res.columns = res.columns.get_level_values(1)
print(res)
count sum mean nunique
type
a 2 100 50.0 2
b 2 27 13.5 1