You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中对连续布尔值分组,存储索引、列切片及相关数据

实现连续布尔值块的分组统计

没问题,我来帮你搞定这个连续布尔值块的分组需求。咱们可以借助Pandas的分组功能,结合shift()和cumsum()来识别连续相同的布尔块,然后提取你需要的所有信息。

完整实现代码

import pandas as pd
import numpy as np

# 生成测试数据(设置随机种子保证结果可复现)
np.random.seed(42)
v1 = list(np.random.rand(30))
v2 = list(np.random.rand(30))
mydf = pd.DataFrame(data=zip(v1, v2), columns=['var1', 'var2'])

# 生成布尔条件列
mydf['cond1'] = mydf['var1'] > 0.2
mydf['cond2'] = mydf['var1'] > 0.8

# ---------------------- 核心分组逻辑 ----------------------
# 为连续相同的cond1值生成唯一组ID:当当前行与上一行cond1值不同时,组ID+1
mydf['group_id'] = mydf['cond1'].ne(mydf['cond1'].shift()).cumsum()

# 按组ID聚合,提取所需信息
summary = mydf.groupby('group_id').agg(
    Start=('var1', lambda x: x.index[0]),  # 块起始索引
    End=('var1', lambda x: x.index[-1]),   # 块结束索引
    Start_var2=('var2', 'first'),          # 起始索引对应的var2值
    End_var2=('var2', 'last'),             # 结束索引对应的var2值
    Value=('cond1', 'first'),              # 分组的布尔值(同组内一致)
    var1_list=('var1', list)               # 块内所有var1值组成的列表
).reset_index(drop=True)  # 去掉不需要的group_id列

# 查看结果
print(summary)

代码关键部分解释

  1. 生成连续块组ID:mydf['cond1'].ne(mydf['cond1'].shift())会生成一个布尔序列,标记当前行与上一行的cond1值是否不同;再用cumsum()累加,就能给每一段连续相同的布尔值分配唯一的组ID。
  2. 聚合提取信息:通过groupby('group_id')分组后,用agg()一次性提取所有需要的字段:
    • Start和End分别取每组的第一个和最后一个索引
    • Start_var2和End_var2取每组的第一个和最后一个var2值
    • Value取每组的cond1值(同组内所有值相同,取第一个即可)
    • var1_list把每组的var1值打包成列表

示例结果(部分展示)

Start  End  Start_var2  End_var2  Value                                          var1_list
0      0    0    0.374540  0.374540   True  [0.3745401188473625]
1      1    1    0.950714  0.950714   True  [0.9507143064099162]
2      2    2    0.731994  0.731994   True  [0.7319939418114051]
3      3    3    0.598658  0.598658   True  [0.5986584841970366]
4      4    4    0.156019  0.156019  False  [0.15601864044243652]

切换到cond2的方法

如果要对cond2进行分组统计,只需要把代码里的cond1替换成cond2即可:

# 生成cond2的组ID
mydf['group_id_cond2'] = mydf['cond2'].ne(mydf['cond2'].shift()).cumsum()

# 聚合cond2的分组信息
summary_cond2 = mydf.groupby('group_id_cond2').agg(
    Start=('var1', lambda x: x.index[0]),
    End=('var1', lambda x: x.index[-1]),
    Start_var2=('var2', 'first'),
    End_var2=('var2', 'last'),
    Value=('cond2', 'first'),
    var1_list=('var1', list)
).reset_index(drop=True)

内容的提问来源于stack exchange,提问作者00__00__00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:32