【问题标题】:Count occurences of True/False in column of dataframe计算数据框列中真/假的出现次数
【发布时间】:2019-04-24 05:45:38
【问题描述】:

有没有一种方法可以计算一列中布尔值的出现次数,而无需遍历 DataFrame?

做类似的事情

df[df["boolean_column"]==False]["boolean_column"].sum()

将不起作用,因为 False 的值为 0,因此零之和将始终返回 0。

显然,您可以通过遍历列并检查来计算出现次数,但我想知道是否有这样做的 pythonic 方式。

【问题讨论】:

    标签: python pandas boolean counter series


    【解决方案1】:

    这里试图在提供答案时尽可能地直截了当和简短。 value_counts() 策略最终可能更灵活。累积sum 和计数count 是不同的,每个都表达一种分析意图,sum 取决于数据类型。

    “计算数据框列中真/假的出现次数”

    import pd
    df = pd.DataFrame({'boolean_column': [True, False, True, False, True]})
    
    df[df==True].count()
    #boolean_column    3
    #dtype: int64
    
    df[df!=False].count()
    #boolean_column    3
    #dtype: int64
    
    df[df==False].count()
    #boolean_column    2
    #dtype: int64
    

    【讨论】:

      【解决方案2】:

      我在这里找不到我真正需要的东西。我需要 True 和 False 出现的次数来进一步计算,所以我使用了:

      true_count = (df['column']).value_counts()[True]
      False_count = (df['column']).value_counts()[False]
      

      其中 df 是您的 DataFrame,column 是带有布尔值的列。

      【讨论】:

      • 这不是很容易从接受的答案推断出来的吗?
      【解决方案3】:
      df.isnull() 
      

      返回一个布尔值。 True 表示缺失值。

      df.isnull().sum() 
      

      返回True 值的按列总和。

      df.isnull().sum().sum() 
      

      返回 NA 元素的总数。

      【讨论】:

      • 但是 OP 不想计算缺失的单元格,而是计算其中包含布尔值的单元格...
      【解决方案4】:

      如果您在 DataFrame 中有一个带有布尔值的列,或者更有趣的是,如果您没有它但您想找到满足特定条件的列中的值的数量,您可以尝试这样的操作(例如我使用

      (df['col']<=value).value_counts()
      

      括号创建一个带有 # of True/False 值的元组,您也可以将其用于其他计算,访问元组添加 [0] 表示 False 计数和 [1] 表示 True 计数,即使没有创建额外的变量:

      (df['col']<=value).value_counts()[0] #for falses
      (df['col']<=value).value_counts()[1] #for trues
      

      【讨论】:

      • 我前段时间用过这种方式,但这不是一个好方法。首先,value_counts 先给你最丰富的 value/bin,然后降序排列。因此,如果您不知道什么是最可能的值,那么第一个值可能不是“假”。其次,如果您只有一个值, df.[whatever].value_counts()[1] 将引发错误,因为没有这样的元素。从这个意义上说,使用 .sum 或 .value.sum 的方法更安全。
      【解决方案5】:

      这种替代方法也适用于多列和/或多行。

      df[df==True].count(axis=0)
      

      将为您提供每列 True 值的总数。对于逐行计数,设置axis=1

      df[df==True].count().sum()
      

      最后添加sum() 将获得整个DataFrame 中的总量。

      【讨论】:

        【解决方案6】:

        使用pd.Series.value_counts():

        >> df = pd.DataFrame({'boolean_column': [True, False, True, False, True]})
        >> df['boolean_column'].value_counts()
        True     3
        False    2
        Name: boolean_column, dtype: int64
        

        如果要分别计算FalseTrue,可以使用pd.Series.sum() + ~

        >> df['boolean_column'].values.sum()  # True
        3
        >> (~df['boolean_column']).values.sum() # False
        2
        

        【讨论】:

          【解决方案7】:

          对于 Pandas,自然的方式是使用 value_counts

          df = pd.DataFrame({'A': [True, False, True, False, True]})
          
          print(df['A'].value_counts())
          
          # True     3
          # False    2
          # Name: A, dtype: int64
          

          要分别计算 TrueFalse 值,不要与 True / False 显式比较,只需 sum 并通过 ~ 取反向布尔值来计算 False 值:

          print(df['A'].sum())     # 3
          print((~df['A']).sum())  # 2
          

          这是可行的,因为boolint 的子类,并且该行为也适用于 Pandas 系列/NumPy 数组。

          或者,您可以使用 NumPy 计算计数:

          print(np.unique(df['A'], return_counts=True))
          
          # (array([False,  True], dtype=bool), array([2, 3], dtype=int64))
          

          【讨论】:

            【解决方案8】:

            你可以简单地总结:

            sum(df["boolean_column"])
            

            这将找到“真”元素的数量。

            len(df["boolean_column"]) - sum(df["boolean_column"])
            

            将产生“假”元素的数量。

            【讨论】:

            • 请注意,将内置函数与 Pandas / NumPy 对象一起使用并不是一个好习惯。要获得矢量化优势,请使用 pd.Series.sumnp.ndarray.sum
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-09
            • 2022-01-04
            • 1970-01-01
            • 1970-01-01
            • 2021-10-15
            • 2021-01-11
            相关资源
            最近更新 更多