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

Posted

技术标签:

【中文标题】计算数据框列中真/假的出现次数【英文标题】: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 方式。

【问题讨论】:

【参考方案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

以上是关于计算数据框列中真/假的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个计算数据框列中 ID 频率的列?

按条件从列表的数据框列中计算和删除元素

如何计算 ID 在不同表的列中出现的次数

powerbi如何统计某列数据中,两项出现的次数

访问:计算 2 列中的出现次数 [关闭]

熊猫计算列中每个值的出现次数