使用 groupby 的 Pandas 占总数的百分比

发布于 2022-07-28 23:17:00

这显然很简单,但作为一个麻木的新手,我被卡住了。

我有一个 CSV 文件,其中包含 3 列,即州、办公室 ID 和该办公室的销售额。

我想计算给定州每个办公室的销售额百分比(每个州所有百分比的总和为 100%)。

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                   'office_id': range(1, 7) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})

df.groupby(['state', 'office_id']).agg({'sales': 'sum'})

这将返回:

                  sales
state office_id        
AZ    2          839507
      4          373917
      6          347225
CA    1          798585
      3          890850
      5          454423
CO    1          819975
      3          202969
      5          614011
WA    2          163942
      4          369858
      6          959285

我似乎无法弄清楚如何“达到”state水平groupby以总计sales整个state以计算分数。

关注者
0
被浏览
23
1 个回答
  • 面试哥
    面试哥 2022-07-28
    为面试而生,有面试问题,就找面试哥。

    2022 年 3 月更新

    using这个答案transform看起来比我原来的答案好得多!

    df['sales'] / df.groupby('state')['sales'].transform('sum')
    

    感谢发表的评论。

    原始答案(2014)

    H的回答是正确的,您将不得不制作第二个groupby对象,但您可以以更简单的方式计算百分比
    - 只需groupby将列state_officesales以其总和即可。复制 Paul H 答案的开头:

    # From Paul H
    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,
                       'sales': [np.random.randint(100000, 999999)
                                 for _ in range(12)]})
    state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
    # Change: groupby state_office and divide by sum
    state_pcts = state_office.groupby(level=0).apply(lambda x:
                                                     100 * x / float(x.sum()))
    

    回报:

                         sales
    state office_id           
    AZ    2          16.981365
          4          19.250033
          6          63.768601
    CA    1          19.331879
          3          33.858747
          5          46.809373
    CO    1          36.851857
          3          19.874290
          5          43.273852
    WA    2          34.707233
          4          35.511259
          6          29.781508
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看