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

如何在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, '')

代码解释

  1. 恢复原始结构:先转置DataFrame,把空值转回False,方便后续判断重复行。
  2. 划分连续重复组:用diff().any(axis=1)检测每行与前一行是否有差异,只要有一列不同就标记为True;再用cumsum()生成分组ID,让连续重复的行进入同一个分组。
  3. 合并区间与取值:对每个分组,合并区间时取组内第一个区间的左边界、最后一个区间的右边界;取值直接取组内第一行(因为重复行的值完全一致)。
  4. 格式化输出:转回原结构,把False替换为空值,得到目标DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:20:30