gpt4 book ai didi

python - 更有效/干净的方式来聚合数据

转载 作者:行者123 更新时间:2023-12-03 18:32:02 25 4
gpt4 key购买 nike

python 3.7.10
Pandas 1.1.5
想象一下,我们的 Dataframe 有两列包含类别,第三列包含数字。
任务是按第一个类别分组,然后按第二个类别分组,并计算总数和份额。

import pandas as pd

df = pd.DataFrame({
'fruit': ['orange', 'orange', 'orange', 'banana', 'banana', 'banana'],
'origin': ['USA', 'Canada', 'USA', 'Canada', 'USA', 'Canada'],
'weight': [1, 2, 3, 4, 5, 6]
})
df



水果
起源
重量


0
橙子
美国
1个

1个
橙子
加拿大
2

2
橙子
美国
3

3
香蕉
加拿大
4

4
香蕉
美国
5

5
香蕉
加拿大
6

(df
.groupby('fruit')
.apply(lambda x: (x
.groupby('origin')
.agg({'weight': sum})
.assign(share=lambda x: x.weight / x.weight.sum()))
)
)


水果
起源
重量
分享


香蕉
加拿大
10
0.666667

美国
5
0.333333

橙子
加拿大
2
0.333333

美国
4
0.666667


是否有更多的 Pythonic/pandish/更清洁的方法来实现相同的结果。
例如,我不能即时重命名 weight 以防它不是 sum 而是 count 并且我希望列名反射(reflect)这一点。
在 R 中,它看起来更干净。
library(dplyr)

df <- tibble(
fruit = c('orange', 'orange', 'orange', 'banana', 'banana', 'banana'),
origin = c('USA', 'Canada', 'USA', 'Canada', 'USA', 'Canada'),
weight = c(1, 2, 3, 4, 5, 6)
)

df %>%
group_by(fruit, origin) %>%
summarise(total = sum(weight)) %>%
mutate(share = total / sum(total))
我相信在 python 中有一些更简洁的方法。

最佳答案

您可以使用两个单独的 groupby 语句使其更清晰:

In [101]: x = df.groupby(['fruit', 'origin']).sum().reset_index()
In [104]: x['share'] = x.groupby('fruit')['weight'].apply(lambda i: i/i.sum())

In [105]: x
Out[105]:
fruit origin weight share
0 banana Canada 10 0.666667
1 banana USA 5 0.333333
2 orange Canada 2 0.333333
3 orange USA 4 0.666667
,根据@Manakin 的评论,避免应用:
In [101]: x = df.groupby(['fruit', 'origin']).sum().reset_index()
In [109]: x['share'] = x['weight'].div(x.groupby('fruit')['weight'].transform('sum'))

In [110]: x
Out[110]:
fruit origin weight share
0 banana Canada 10 0.666667
1 banana USA 5 0.333333
2 orange Canada 2 0.333333
3 orange USA 4 0.666667

关于python - 更有效/干净的方式来聚合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66373110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com