在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)
代码关键部分解释
- 生成连续块组ID:
mydf['cond1'].ne(mydf['cond1'].shift())会生成一个布尔序列,标记当前行与上一行的cond1值是否不同;再用cumsum()累加,就能给每一段连续相同的布尔值分配唯一的组ID。 - 聚合提取信息:通过
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
相关产品推荐
相关产品推荐

