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