如何基于多次出现的flag=1条件提取Pandas DataFrame数据块?
提取Pandas DataFrame中连续的flag=1数据块
没问题,我来帮你搞定这个需求!要提取DataFrame中连续的flag=1数据块,我们可以通过生成分组标识+按组拆分的方法来实现,具体步骤和代码如下:
步骤1:生成连续块的分组ID
首先我们需要给每一段连续的flag=1数据分配一个唯一的分组ID,这样后续就能按ID拆分出各个数据块:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({"flag":[0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0], "Val":[1, 5, 7, 5, 4, 7, 8, 11, 13, 44, 7 , 8, 10, 14, 12]}) # 标记每个连续flag=1块的起始行,然后累加得到分组ID df['group_id'] = (df['flag'] == 1) & (df['flag'].shift(1) == 0) df['group_id'] = df['group_id'].cumsum()
这里的逻辑是:df['flag'].shift(1)会把flag列向上偏移一行,当当前行flag=1且上一行flag=0时,就说明这是一个新的连续1块的开始,我们用这个条件生成布尔值,再通过cumsum()把这些起始点累加,得到每个块的唯一ID。
步骤2:筛选并拆分数据块
接下来我们筛选出所有flag=1的行,然后按group_id分组,就能得到各个独立的数据块:
# 筛选flag=1的行,按group_id分组后转成列表 chunks = [group for _, group in df[df['flag'] == 1].groupby('group_id')]
步骤3:查看结果
你可以通过循环来打印每个数据块:
for idx, chunk in enumerate(chunks, start=1): print(f"Chunk {idx}") # 只展示Val和flag列(可选) print(chunk[['Val', 'flag']]) print("\n")
运行后输出的结果就是你想要的:
Chunk 1
Val flag
2 7 1
3 5 1
4 4 1
5 7 1Chunk 2
Val flag
9 44 1
10 7 1
11 8 1
12 10 1
这样得到的chunks是一个列表,每个元素都是一个独立的DataFrame,你可以单独对每个块进行后续处理~
内容的提问来源于stack exchange,提问作者user2841051
相关产品推荐
相关产品推荐

