如何统计Pandas DataFrame中满足指定布尔条件的行数
统计Pandas DataFrame中指定布尔列满足「或」条件的行数
问题说明
需要统计DataFrame中bool1或bool2列值为True的总行数,预期结果为3。示例DataFrame的构建代码及输出如下:
示例DataFrame构建代码
import pandas as pd from pandas import DataFrame names = {'First_name': ['Jon','Bill','Maria','Emma'], 'Last_name': ['Bobs', 'Vest', 'Gong', 'Hill'], 'Roll': ['Absent', 'Present', 'Present', 'Absent']} df = DataFrame(names) keys = ['Jon', 'Maria', 'Gong', 'Hill', 'Present', 'No'] pattern = r"(?i)" + "|".join(keys) df['bool1'] = df['First_name'].str.contains(pattern) df['bool2'] = df['Last_name'].str.contains(pattern)
生成的DataFrame
First_name Last_name Roll bool1 bool2 0 Jon Bobs Absent True False 1 Bill Vest Present False False 2 Maria Gong Present True True 3 Emma Hill Absent False True
你尝试的两种写法均存在问题:
df.loc[(df['bool1'] == True) | (df['bool2'] == True)].sum()会对筛选后的列进行求和,而非统计符合条件的行数- 直接用
if语句判断整列布尔值,逻辑错误,无法逐行判断条件
正确解决方案
方法1:直接对布尔掩码求和
布尔条件生成的掩码是布尔Series,True等价于1、False等价于0,直接调用sum()即可得到符合条件的行数:
# 简化写法(布尔列无需额外判断==True) count = (df['bool1'] | df['bool2']).sum() print(count) # 输出3
方法2:统计筛选后行的长度
先筛选出满足条件的行,再用len()获取行数:
count = len(df[(df['bool1'] | df['bool2'])]) # 或使用loc索引 count = len(df.loc[(df['bool1'] | df['bool2'])]) print(count)
方法3:多列通用写法(扩展场景)
如果需要统计多列中任意一列为True的行数,可使用any(axis=1)逐行判断,再求和:
# 针对bool1、bool2列 count = df[['bool1', 'bool2']].any(axis=1).sum() print(count)
内容的提问来源于stack exchange,提问作者Abir
相关产品推荐
相关产品推荐

