如何在Pandas中对连续后续分组对执行计算?
解决方法:提取连续set_id对的子DataFrame
针对你的问题,核心是要识别出set_id连续递增1的配对(比如(0,1)、(4,5)、(5,6)),同时处理set_id=5属于两个配对的特殊情况。下面是基于Pandas的分步解决方案:
步骤1:初始化原始数据
先确认我们的初始DataFrame:
import pandas as pd df = pd.DataFrame( {'set_id': [0, 0,1,1,4,4,5,5,6,6], 'data': [-27, -45,-52,-65,-37, 20, 17, -45, -44, 15]} )
步骤2:识别连续的set_id配对
首先提取去重后的set_id序列,然后筛选出满足「后一个set_id = 当前set_id +1」的有效配对:
# 获取去重后的set_id序列 unique_sets = df['set_id'].unique() # 筛选连续递增1的set_id对 continuous_pairs = [ (unique_sets[i], unique_sets[i+1]) for i in range(len(unique_sets)-1) if unique_sets[i+1] == unique_sets[i] + 1 ] # 输出结果:[(0, 1), (4, 5), (5, 6)]
步骤3:提取每个连续对对应的子DataFrame
我们可以把每个连续对的子DataFrame存入列表,方便后续对每个配对单独执行计算:
# 生成每个连续对的子DataFrame列表 continuous_dfs = [df[df['set_id'].isin(pair)] for pair in continuous_pairs]
现在continuous_dfs里包含三个子DataFrame:
- 第一个对应set_id=(0,1)的所有行
- 第二个对应set_id=(4,5)的所有行
- 第三个对应set_id=(5,6)的所有行
可选:合并所有连续对的行(含重复的set_id=5行)
如果需要把这些子DataFrame合并成一个整体,可以用pd.concat:
combined_df = pd.concat(continuous_dfs, ignore_index=True)
可选:仅筛选属于连续对的set_id(无重复行)
如果你只需要保留所有属于连续配对的set_id的行(不需要重复显示set_id=5的行),可以先收集所有有效set_id再筛选:
# 收集所有在连续配对中的set_id valid_set_ids = {s for pair in continuous_pairs for s in pair} filtered_df = df[df['set_id'].isin(valid_set_ids)]
这个方案完全基于Pandas原生操作,不需要额外的分组标记,完美处理了set_id属于多个连续配对的情况,后续你可以直接遍历continuous_dfs对每个连续配对执行你的系列计算。
内容的提问来源于stack exchange,提问作者moshevi
相关产品推荐
相关产品推荐

