【问题标题】:how to get percentage for groupby size如何获得分组大小的百分比
【发布时间】:2019-02-20 12:28:20
【问题描述】:

我正在寻找一种获取百分比的方法

df.groupby(['state', 'approved_or_not']).size()

Output:

school_state  project_is_approved
AK            0                         55
              1                        290
AL            0                        256
              1                       1506
AR            0                        177
              1                        872
AZ            0                        347
              1                       1800

这很好,但我想要的是百分比而不是计数。

school_state  project_is_approved
AK            0                        0.16
              1                        0.84
AL            0                        0.14
              1                        0.86

我试过了,但找不到办法。是否有人可以提供帮助?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    SeriesGroupBy.value_counts与参数normalize=True一起使用:

    df.groupby('state')['approved_or_not'].value_counts(normalize=True)
    

    示例

    np.random.seed(2019)
    
    L = list('ABC')
    df = pd.DataFrame({'state':np.random.choice(L, size=10),
                       'approved_or_not':np.random.choice([0,1], size=10)})
    print (df)
      state  approved_or_not
    0     A                0
    1     C                0
    2     B                1
    3     A                0
    4     C                1
    5     C                1
    6     A                0
    7     B                0
    8     A                0
    9     C                1
    

    a = df.groupby(['state', 'approved_or_not']).size()
    print (a)
    A      0                  4
    B      0                  1
           1                  1
    C      0                  1
           1                  3
    dtype: int64
    
    a = df.groupby('state')['approved_or_not'].value_counts(normalize=True)
    print (a)
    state  approved_or_not
    A      0                  1.00
    B      0                  0.50
           1                  0.50
    C      1                  0.75
           0                  0.25
    Name: approved_or_not, dtype: float64
    

    编辑:您可以将Series.div 除以sum 每一级state

    a = df.groupby(['state', 'approved_or_not']).size()
    
    a = a.div(a.sum(level=0), level=0)
    print (a)
    state  approved_or_not
    A      0                  1.00
    B      0                  0.50
           1                  0.50
    C      0                  0.25
           1                  0.75
    dtype: float64
    

    【讨论】:

    • jezrael,是否可以在不使用值计数的情况下获得百分比?
    【解决方案2】:

    我已经使用聚合函数解决了。

    例子:

    import pandas as pd
    import numpy as np
    
    np.random.seed(316)
    

    lst = ['Karnataka', 'Tamil Nadu', 'Kerala']

    data = pd.DataFrame({'state':np.random.choice(lst, size=10),
                       'approved_or_not':np.random.choice([2,4], size=10)})
    

    print (data)

    data.groupby(['state', 'approved_or_not']).agg({'approved_or_not': ["size", "mean"]})

    输出

                                    approved_or_not
                                    size    mean
        state   approved_or_not     
    Karnataka                2      4        2
    Kerala                   2      1        2
                             4      3        4
    Tamil Nadu               2      1        2
                             4      1        4
    

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2015-03-02
      • 2019-06-08
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2021-01-09
      相关资源
      最近更新 更多