【问题标题】:get dataframe row count based on conditions根据条件获取数据帧行数
【发布时间】:2013-06-26 13:56:02
【问题描述】:

我想根据条件选择获取数据框行数。我尝试了以下代码。

print df[(df.IP == head.idxmax()) & (df.Method == 'HEAD') & (df.Referrer == '"-"')].count()

输出:

IP          57
Time        57
Method      57
Resource    57
Status      57
Bytes       57
Referrer    57
Agent       57
dtype: int64

输出显示数据框中每一列的计数。相反,我需要在满足上述所有条件的情况下进行一次计数?这该怎么做?如果您需要有关我的数据框的更多说明,请告诉我。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您要求的条件是所有条件都为真, 所以框架的 len 就是答案,除非我误解了你在问什么

    In [17]: df = DataFrame(randn(20,4),columns=list('ABCD'))
    
    In [18]: df[(df['A']>0) & (df['B']>0) & (df['C']>0)]
    Out[18]: 
               A         B         C         D
    12  0.491683  0.137766  0.859753 -1.041487
    13  0.376200  0.575667  1.534179  1.247358
    14  0.428739  1.539973  1.057848 -1.254489
    
    In [19]: df[(df['A']>0) & (df['B']>0) & (df['C']>0)].count()
    Out[19]: 
    A    3
    B    3
    C    3
    D    3
    dtype: int64
    
    In [20]: len(df[(df['A']>0) & (df['B']>0) & (df['C']>0)])
    Out[20]: 3
    

    【讨论】:

    • 是的!这就是我想要的:) 非常感谢!
    • 哪个更快? len(df[(df['A']>0)])sum(df['A']>0)?
    • 不需要用另一个 df 包裹,只需加上掩码就足够了:((df['A']>0) & (df['B']>0) & (df['C']>0)).sum()
    • 注意:在 Pandas 中,count() 不包括空值。
    【解决方案2】:

    为了提高性能,您不应使用谓词评估数据框。您可以直接使用谓词的结果,如下所示:

    In [1]: import pandas as pd
            import numpy as np
            df = pd.DataFrame(np.random.randn(20,4),columns=list('ABCD'))
    
    
    In [2]: df.head()
    Out[2]:
              A         B         C         D
    0 -2.019868  1.227246 -0.489257  0.149053
    1  0.223285 -0.087784 -0.053048 -0.108584
    2 -0.140556 -0.299735 -1.765956  0.517803
    3 -0.589489  0.400487  0.107856  0.194890
    4  1.309088 -0.596996 -0.623519  0.020400
    
    In [3]: %time sum((df['A']>0) & (df['B']>0))
    CPU times: user 1.11 ms, sys: 53 µs, total: 1.16 ms
    Wall time: 1.12 ms
    Out[3]: 4
    
    In [4]: %time len(df[(df['A']>0) & (df['B']>0)])
    CPU times: user 1.38 ms, sys: 78 µs, total: 1.46 ms
    Wall time: 1.42 ms
    Out[4]: 4
    

    请记住,此技术仅适用于计算符合您的谓词的行数。

    【讨论】:

      【解决方案3】:

      在 Pandas 中,我喜欢使用 shape 属性来获取行数。

      df[df.A > 0].shape[0]
      

      根据需要给出匹配条件A > 0 的行数。

      【讨论】:

        【解决方案4】:

        您可以使用方法query 并获取结果数据帧的shape。例如:

           A  B  C
        0  1  1  x
        1  2  2  y
        2  3  3  z
        
        df.query("A == 2 & B > 1 & C != 'z'").shape[0]
        

        输出:

        1
        

        【讨论】:

        • 我有点晚了,但有一个类似的问题:如果我循环列值,那么这个方法可以通过将该变量与某个值进行比较来工作吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        相关资源
        最近更新 更多