如何按segID分段统计DataFrame中指定列的False值数量?
解决按分段统计False数量的问题
原代码的问题
- 你把
False替换成了0,所以cols2里只有0和1,用Counter(df['cols2'])找False会触发KeyError,因为列里根本没有布尔值False。 groupby('segID')[cols2 , false_count].sum()是错误写法:cols2需要加引号,且false_count是全局统计的总数,不能作为列名传入分组操作。
修正方案
你要统计的是每个segID分段中,当前值与前一个值不等(即原逻辑中的False)的数量,以下是几种简洁的实现方式:
方式一:基于现有cols2列统计
因为cols2=0对应原逻辑的False,直接统计每个分段中0的个数:
df['cols2'] = df['cols1'].diff().eq(0).replace({False: 0, True: 1}) # 按segID分组,统计cols2为0的行数 seg_false_count = df.groupby('segID')['cols2'].apply(lambda x: (x == 0).sum()) print(seg_false_count)
方式二:直接用布尔列统计(更直观)
不需要把布尔值替换成0/1,直接保留原布尔列,统计False的数量:
# 生成布尔列:True=当前与前一个值相等,False=不等 df['is_equal_to_prev'] = df['cols1'].diff().eq(0) # 按segID分组,统计False的数量(取反后求和) seg_false_count = df.groupby('segID')['is_equal_to_prev'].apply(lambda x: (~x).sum()) print(seg_false_count)
方式三:同时统计True和False数量
如果需要同时查看每个分段的总行数、True数量和False数量:
df['is_equal_to_prev'] = df['cols1'].diff().eq(0) seg_stats = df.groupby('segID')['is_equal_to_prev'].agg( total_rows='count', true_count='sum', false_count=lambda x: (~x).sum() ) print(seg_stats)
内容的提问来源于stack exchange,提问作者April F
相关产品推荐
相关产品推荐

