【问题标题】:Calculating the percentage of a category in Pandas计算 Pandas 中某个类别的百分比
【发布时间】:2019-12-30 20:23:06
【问题描述】:

我有一个数据框train,我从train 数据框中过滤了一定数量的行以形成promoted 数据框:

print(train.department.value_counts(),'\n')
promoted=train[train.is_promoted==1]
print(promoted.department.value_counts())

以上代码的输出为:

Sales & Marketing    16840
Operations           11348
Technology            7138
Procurement           7138
Analytics             5352
Finance               2536
HR                    2418
Legal                 1039
R&D                    999
Name: department, dtype: int64

Sales & Marketing    1213
Operations           1023
Technology            768
Procurement           688
Analytics             512
Finance               206
HR                    136
R&D                    69
Legal                  53
Name: department, dtype: int64

我想显示从promoted 数据框中的train 中出现的列部门的每个类别的百分比,即而不是数字 1213,1023,768,688 等。我应该得到一个百分比,例如:1213/16840*100=7.2等。请注意,我不想要标准化值。

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    试试:

    promoted.department.value_counts()/train.department.value_counts()*100
    

    它应该会给你想要的输出:

    Sales & Marketing    7.2030
    Operations           9.0148
    Technology          10.7593 
    .....                 ...
    Name: department, dtype: int64
    

    【讨论】:

    • 如果我希望结果按降序排列怎么办?
    • @Ronith 试试(promoted.department.value_counts()/train.department.value_counts()*100)[::-1]。在value_counts 中试验ascending 参数以获得所需的结果。
    • (promoted.department.value_counts()/train.department.value_counts()*100)[::-1] 不起作用,您能解释一下我如何将ascending 参数用于两个不同数据帧的两个不同列。
    • 是的。我知道 ascending=False 会给我降序的值,但我想知道如何按降序获取这个答案中给出的输出。
    • @Ronith 看来你只需要(promoted.department.value_counts()/train.department.value_counts()*100).sort_values(ascending=False)?
    【解决方案2】:

    这个怎么样?示例有一个玩具数据集,但关键思想只是将一个值除以另一个。

    import pandas as pd
    import numpy as np
    
    data = pd.DataFrame({
        'department': list(range(10)) * 100,
        'is_promoted': np.random.randint(0, 2, size =  1000)
    })
    
    # Slice out promoted data.
    
    data_promoted = data[data['is_promoted'] == 1]
    
    # Calculate share of each department that is present in data_promoted.
    
    data_promoted['department'].value_counts().sort_index() / data['department'].value_counts().sort_index()
    

    给予:

    0    0.50
    1    0.52
    2    0.45
    3    0.54
    4    0.41
    5    0.50
    6    0.45
    7    0.52
    8    0.60
    9    0.52
    Name: department, dtype: float64
    

    【讨论】:

      【解决方案3】:
      import pandas as pd
      df = pd.read_csv("/home/spaceman/my_work/Most-Recent-Cohorts-Scorecard-Elements.csv")
      df=df[['STABBR']] #each values is appearing in dataframe with multiple 
      #after that i got  
      CA    717
      TX    454
      NY    454
      FL    417
      PA    382
      OH    320
      IL    280
      MI    189
      NC    189
      .........
      .........
      
      print df['STABBR'].value_counts(normalize=True) #returns the relative 
      frequency by dividing all values by the sum of values
      CA    0.099930
      TX    0.063275
      NY    0.063275
      FL    0.058118
      PA    0.053240
      OH    0.044599
      IL    0.039024
      MI    0.026341
      NC    0.026341
      ..............
      ..............
      

      【讨论】:

        【解决方案4】:

        找到更好的答案:https://stackoverflow.com/a/50558594/4106458

        建议对 value_counts() 方法使用 normalize=True 命名参数

        对于您的场景,代码为:

        promoted.department.value_counts(normalize=True) * 100
        

        【讨论】:

          猜你喜欢
          • 2017-06-20
          • 2022-06-13
          • 2022-11-21
          • 2018-11-22
          • 1970-01-01
          • 2020-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多