【问题标题】:Get percentage of rows (strings) that fulfil a certain condition in a pandas data frame获取熊猫数据框中满足特定条件的行(字符串)的百分比
【发布时间】:2018-03-11 07:05:23
【问题描述】:

我有这个数据框:

df = pd.DataFrame({"A": ["Used", "Not used", "Not used", "Not used", "Used",
                         "Not used", "Used", "Used", "Used", "Not used"],
                   "B": ["Used", "Used", "Used", "Not used", "Not used",
                        "Used", "Not used", "Not used", "Used", "Not used"]})

我想找到最快、最干净的方法来找出以下内容:

  • 已使用A的所有行的百分比。
  • 使用过B的所有行的百分比。
  • 使用过 A 和 B 的所有行的百分比。

我是 Python 和 pandas 的新手(以及一般的编码),所以我确信这非常简单,但如果有任何指导,我将不胜感激。我试过 groupby().aggregate(sum) 但我没有得到我需要的结果(我想是因为这些是字符而不是整数。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    如果需要所有值的百分比,请使用value_countsnormalize=True,对于多列groupbysize,所有对的长度除以length of df(与索引长度相同):

    print (100 * df['A'].value_counts(normalize=True))
    Not used    50.0
    Used        50.0
    Name: A, dtype: float64
    
    print (100 * df['B'].value_counts(normalize=True))
    Not used    50.0
    Used        50.0
    Name: B, dtype: float64
    
    print (100 * df.groupby(['A','B']).size() / len(df.index))
    A         B       
    Not used  Not used    20.0
              Used        30.0
    Used      Not used    30.0
              Used        20.0
    dtype: float64
    

    如果需要过滤器值,则创建掩码并获取 mean - Trues 像 1s 一样处理:

    print (100 * df['A'].eq('Used').mean())
    #alternative
    #print (100 * (df['B'] == 'Used').mean())
    50.0
    
    print (100 * df['B'].eq('Used').mean())
    #alternative
    #print (100 * (df['B'] == 'Used').mean())
    50.0
    
    print (100 * (df['A'].eq('Used') & df['B'].eq('Used')).mean())
    20.0
    

    【讨论】:

      【解决方案2】:

      使用

      1) 二手A

      In [4929]: 100.*df.A.eq('Used').sum()/df.shape[0]
      Out[4929]: 50.0
      

      2) 二手 B

      In [4930]: 100.*df.B.eq('Used').sum()/df.shape[0]
      Out[4930]: 50.0
      

      3) 二手 A 和二手 B

      In [4931]: 100.*(df.B.eq('Used') & df.A.eq('Used')).sum()/df.shape[0]
      Out[4931]: 20.0
      

      1) 与

      相同
      In [4933]: 100.*(df['A'] == 'Used').sum()/len(df.index)
      Out[4933]: 50.0
      

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 2016-08-22
        • 1970-01-01
        • 2020-11-09
        • 2011-07-12
        • 2022-07-22
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多