Pandas 数据帧分组和基于多列的百分比

Pandas dataframe groupby and percent based on multiple columns

提问人:Shekar Tippur 提问时间:10/13/2021 最后编辑:Shekar Tippur 更新时间:10/13/2021 访问量:116

问:

我希望计算 2 列的百分比并扩充到原始数据帧。

import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
               'office_id': list(range(1, 7)) * 2,
               'counts': list(range(1, 3)) * 6,
               'sales_year': [np.random.randint(2019, 2021) for _ in range(12)],
               'sales': [np.random.randint(100000, 999999) for _ in range(12)]})

state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
state = df.groupby(['sales_year']).agg({'sales': 'sum'})
state_office.div(state, level='state') * 100
  • 我想计算每个组 ['state', 'office_id', 'sales_year] 的销售额百分比,并添加到一个名为“aggr_sales”的新列中(我想保留原始列名称)
  • 计算每个组的计数百分比并添加到新列“aggr_counts”(我想保留原始列名)
  • 我想要一个包含两个百分比的单个数据帧。

感谢任何意见。

谢谢 S

python-3.x pandas 数据帧

评论

1赞 mozway 10/13/2021
你的问题模棱两可,你想按(这三个一起)分组吗?这将产生只有单行的组,因此每个组的所有百分比都将是 100%['state', 'office_id', 'sales_year]
0赞 Shekar Tippur 10/13/2021
你是对的,让我通过删除“sales_year”来重新表述这个问题。谢谢你的指出。
0赞 mozway 10/13/2021
仍然是同样的问题,因为每个州只有一个office_id:p我会给你一个状态+sales_year的答案。如果这不是您想要的,请提供预期的输出

答:

0赞 mozway 10/13/2021 #1

以下是分组状态+sales_year的答案:

df['aggr_counts'] = (df.groupby(['state', 'sales_year'])
                       ['sales'].apply(lambda x: 100*x/x.sum())
                     )

输出:

   state  office_id  counts  sales_year   sales  aggr_counts
0     CA          1       1        2019  474564   100.000000
1     WA          2       2        2020  835831    37.219871
2     CO          3       1        2020  836326    35.053616
3     AZ          4       2        2019  410744    29.372909
4     CA          5       1        2020  270584    25.895015
5     WA          6       2        2020  939052    41.816341
6     CO          1       1        2020  704474    29.527195
7     AZ          2       2        2020  641377   100.000000
8     CA          3       1        2020  774343    74.104985
9     WA          4       2        2020  470775    20.963789
10    CO          5       1        2020  845048    35.419188
11    AZ          6       2        2019  987633    70.627091