如何在Pandas DataFrame中将重复行列合并为区间?
Pandas合并重复区间列的优雅解决方案
先看原始可复现代码,生成的DataFrame中存在多组连续重复列,对应0-1、1-2这类小区间,我们需要将这些重复列合并为0-4、4-8这类大区间,同时更新索引:
import pandas as pd from random import randint as ri from random import choice get_pattern = lambda: [i for ii in [[choice([True,False])]*ri(2,6) for _ in range(0,5)] for i in ii] patterns = [get_pattern()[:15] for _ in range(0,3)] df = pd.DataFrame({ 'A': patterns[0], 'B': patterns[1], 'C': patterns[2] }, index = pd.interval_range(start=0, end=15, closed='both')).T.replace(False,'')
需求是替代遍历查找的繁琐方法,将重复列(转置前为重复行)合并,得到指定结构的DataFrame。
优雅解决方案代码
# 转置回原始结构,将空值恢复为False df_original = df.T.replace('', False) # 生成分组键:连续重复的行会被归为同一组 group_key = df_original.diff().any(axis=1).cumsum() # 分组处理:合并区间、提取重复值 result_df = df_original.groupby(group_key).agg( interval=('index', lambda x: pd.Interval(left=x.iloc[0].left, right=x.iloc[-1].right, closed='both')), A=('A', 'first'), B=('B', 'first'), C=('C', 'first') ).set_index('interval').T.replace(False, '')
代码解释
- 恢复原始结构:先转置DataFrame,把空值转回
False,方便后续判断重复行。 - 划分连续重复组:用
diff().any(axis=1)检测每行与前一行是否有差异,只要有一列不同就标记为True;再用cumsum()生成分组ID,让连续重复的行进入同一个分组。 - 合并区间与取值:对每个分组,合并区间时取组内第一个区间的左边界、最后一个区间的右边界;取值直接取组内第一行(因为重复行的值完全一致)。
- 格式化输出:转回原结构,把
False替换为空值,得到目标DataFrame。
内容的提问来源于stack exchange,提问作者DiMithras
相关产品推荐
相关产品推荐

