计算数据框列中真/假的出现次数
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
如果要分别计算False
和True
,可以使用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
要分别计算 True
或 False
值,不要与 True
/ False
显式比较,只需 sum
并通过 ~
取反向布尔值来计算 False
值:
print(df['A'].sum()) # 3
print((~df['A']).sum()) # 2
这是可行的,因为bool
是int
的子类,并且该行为也适用于 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.sum
或 np.ndarray.sum
。以上是关于计算数据框列中真/假的出现次数的主要内容,如果未能解决你的问题,请参考以下文章