给出此数据框:
df
animal location number
0 lions zoo1 10
1 tigers zoo2 200
2 bears zoo2 300
3 ohmy zoo2 400
4 antelopes zoo1 20
5 orangutans zoo2 500
6 zebras zoo1 30
我需要按动物园找到前三名的动物,对它们进行独立于动物类型的汇总,然后对哪个动物园的动物最多进行排名。我已经可以按位置和动物进行选择和分组了,我想现在需要做的是创建一个以位置为键,每个位置的总和为值的序列,但是卡住。 (如果这不是解决问题的最佳方法,那么我欢迎您提出建议。)
df.set_index(['location','number'], inplace=True)
df.groupby(level=[0,1]).sum().reset_index().sort_values(['location', 'number'], ascending=[1,0]).groupby('location').head(3)
location number animal
2 zoo1 30 zebras
1 zoo1 20 antelopes
0 zoo1 10 lions
6 zoo2 500 orangutans
5 zoo2 400 ohmy
4 zoo2 300 bears
(sum()
在这种情况下似乎没有做任何事情,但是我必须为groupby()
做些事情,但我不知道还有什么更好的方法。)我从这里寻找的是:
zoo2 1200
zoo1 60
创建初始df的代码:
df = pd.DataFrame({'animal': ['lions', 'tigers', 'bears', 'ohmy', 'antelopes', 'orangutans','zebras'],
'location': ['zoo1', 'zoo2', 'zoo2', 'zoo2', 'zoo1', 'zoo2', 'zoo1'],
'number': [10, 200, 300, 400, 20, 500, 30]})
答案 0 :(得分:1)
可以使用groupby
:
df.groupby('location')['number'].sum()
将其作为输出返回:
location
zoo1 60
zoo2 1200
Name: number, dtype: int64
答案 1 :(得分:0)
使用您的初始数据框:
df
animal location number
0 lions zoo1 10
1 tigers zoo2 200
2 bears zoo2 300
3 ohmy zoo2 400
4 antelopes zoo1 20
5 orangutans zoo2 500
6 zebras zoo1 30
使用groupby:
df.groupby('location')['number'].apply(lambda x: x.sort_values(ascending=False).head(3).sum())
输出:
location
zoo1 60
zoo2 1200
Name: number, dtype: int64