Python 3.x 在具有起始列和结束列的同一数据帧中高效合并重叠间隔

Python 3.x 在具有起始列和结束列的同一数据帧中高效合并重叠间隔,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我正在合并pandas数据帧中的重叠间隔,并寻找在pandas中实现这一点的有效方法,除了在行1乘1上运行的常规算法之外。我怎样才能在熊猫身上做呢 我已经尝试了在每一行上运行的常规重叠算法,并询问当前行是否开始

我正在合并pandas数据帧中的重叠间隔,并寻找在pandas中实现这一点的有效方法,除了在行1乘1上运行的常规算法之外。我怎样才能在熊猫身上做呢

我已经尝试了在每一行上运行的常规重叠算法,并询问当前行是否开始 假设我有以下数据帧的输入

df:
    START   FINISH
0   0.000000    10.000000
1   10.000000   8700.182997
2   0.000000    10.000000
3   10.000000   9720.687227
4   9850.123    9990.000000
我预计产出如下:

df:
    START   FINISH
0   0.000000    9720.687227
2   9850.123    9990.000000

提前谢谢

你只能用熊猫来做

将熊猫作为pd导入
输入io
##加载数据
开始,结束
0.000000    ,10.000000
10.000000   ,4500.182997
5000.00    ,7000.000000
6000   ,8500.687227
9850.123,9990.000000
"""
buf_字节=io.StringIO(原始)
df=pd.read\u csv(基本字节)
##解决方案
df.sort_值(“开始”,原地=真)
##若下一行的开始大于当前行的结束,则此行进行比较
##行(“shift”向下移动一行)。之前表达式的值
##如果间隔中断(即无法合并),则cumsum将为真,因此
##当间隔中断时,cumsum将增加组值(cum sum treats True=1,False=0)
df[“group”]=(df[“START”]>df[“FINISH”].shift()).cumsum()
##这将返回组中“开始”列的最小值和“完成”列中的最大值
结果=df.groupby(“group”).agg({“开始”:“最小”,“完成”:“最大”})
显示(结果)
输出

 START       FINISH
group                       
0         0.000  4500.182997
1      5000.000  8500.687227
2      9850.123  9990.000000

上述答案令人鼓舞,但仍有一些地方需要改进

(1) 应记录
shift()
将向上移动一条记录,而不是向下移动。 (2)不考虑行在前一个记录的边界内。只需添加
cummax()
,即可解决问题

以下是修改后的代码:

import pandas as pd
import io

## load data

raw ="""START,FINISH
0.000000    ,10.000000
2.000000    ,3.000000
10.000000   ,4500.182997
5000.00    ,7000.000000
6000   ,8500.687227
9850.123,9990.000000
"""

buf_bytes = io.StringIO(raw)
df=pd.read_csv(buf_bytes)

## solution

df.sort_values("START", inplace=True)

## This line compares if START of present row is greater than largest FINISH in previous 
## rows ("shift" shifts up FINISH by one row). The value of expression before
## cumsum will be True if interval breaks (i.e. cannot be merged), so
## cumsum will increment group value when interval breaks (cum sum treats True=1, False=0)


df["group"]=(df["START"]>df["FINISH"].shift().cummax()).cumsum()

print(df)

## this returns min value of "START" column from a group and max value fro m "FINISH"
result=df.groupby("group").agg({"START":"min", "FINISH": "max"})
print(result)
输出:

          START       FINISH
group                       
0         0.000  4500.182997
1      5000.000  8500.687227
2      9850.123  9990.000000
未改性溶液的结果:

          START       FINISH
group                       
0         0.000    10.000000
1        10.000  4500.182997
2      5000.000  8500.687227
3      9850.123  9990.000000

你能补充一些关于解决方案的解释吗?例如,您使用的pandas函数及其对结果的影响?不客气,我在上面对解决方案添加了一些评论,希望helpsit会这样做!全部清楚,谢谢,最后一个问题,我如何才能摆脱结果中的“组”?将索引名称设置为空result.index.name=“”对不起,我指的是组下的整个列