基于数据帧列和创建panda系列

2024-09-30 14:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

给定此数据帧:

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]})

Tags: numberdflocationbears动物groupbyanimalzebras
2条回答

这可以通过groupby实现:

df.groupby('location')['number'].sum()

将此作为输出返回:

location
zoo1      60
zoo2    1200
Name: number, dtype: int64

使用初始数据帧:

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

相关问题 更多 >