如何统计Pandas DataFrame列中True和False的连续块数量
统计布尔值连续块数量的方法
可以通过Pandas的差值检测与分组统计实现需求,以下是具体方案:
实现步骤与代码
1. 完整代码示例
import pandas as pd # 构造示例DataFrame data = {'col': [True, True, True, False, False, False, True, True, False, True]} index = pd.to_datetime([ '2023-05-04 10:34:51.002100665', '2023-05-04 10:34:51.007100513', '2023-05-04 10:34:51.012100235', '2023-05-04 10:34:51.017100083', '2023-05-04 10:34:51.022099789', '2023-05-04 10:35:23.610740595', '2023-05-04 10:35:23.615740466', '2023-05-04 10:35:23.620740227', '2023-05-04 10:35:23.625740082', '2023-05-04 10:35:23.630739797' ]) df = pd.DataFrame(data, index=index) # 标记值变化的位置(第一行默认算新块) change_mask = df['col'].diff().fillna(True) # 生成每个连续块的唯一ID df['block_id'] = change_mask.cumsum() # 按布尔值分组,统计对应块的数量 block_counts = df.groupby('col')['block_id'].nunique() # 输出结果 print(f"Number of True blocks: {block_counts[True]}") print(f"Number of False blocks: {block_counts[False]}")
2. 运行结果
Number of True blocks: 3 Number of False blocks: 2
3. 简化写法
如果不需要保留中间列,可用一行代码完成统计:
block_counts = df['col'].ne(df['col'].shift()).cumsum().groupby(df['col']).nunique()
df['col'].ne(df['col'].shift()):判断当前行与上一行值是否不同,返回布尔序列.cumsum():累加变化点,生成每个连续块的唯一ID.groupby(df['col']).nunique():按布尔值分组,统计每个值对应的唯一块数量
内容的提问来源于stack exchange,提问作者Mike B
相关产品推荐
相关产品推荐

