只保留熊猫坐标行中的最大间隔

Posted

技术标签:

【中文标题】只保留熊猫坐标行中的最大间隔【英文标题】:Keep only largest interval in coordinates row in pandas 【发布时间】:2021-07-13 13:21:29 【问题描述】:

我有一个数据框,例如:

   Groups Name start end  sum
1      G1    A   451 954 1405
2      G1    B   451 951 1402
3      G1    C   451 969 1420
4      G1    D   463 870 1333
5      G1    E   463 888 1351
6      G1    X   230 450  680
7      G1    Z   229 450  681
8      G2    F   119 841  960
9      G2    G   118 842  960
10     G3    H   460 790 1250
11     G3    I   123 300 177
12     G4    J   343 878 1221
13     G4    K   343 878 1221
14     G4    L   320 862 1182

我希望每个组只保留一个区间表示(一个区间意味着 df.startdf.end 在行之间重叠),我解释说:

例如,在G1中有2个区间组

间隔 1(使用 min = 451max = 969):

Name start end sum
A    451   954 1405
B    451   951 1402
C    451   969 1420
D    463   870 1333
E    463   888 1351

那我取最大的df.sum(这里是1420

Interval2(使用min = 229max = 450

Name start end  sum
X    230   450  680
Z    229   450  681

那我取最大的df.sum(这里是681

如果我对整个数据框这样做,我会得到:

   Groups Name start end  sum
3      G1    C   451 969 1420
7      G1    Z   229 450  681
9      G2    G   118 842  960
10     G3    H   460 790 1250
11     G3    I   123 300 177
12     G4    J   343 878 1221

有人有想法吗? 以下是字典格式的数据:

'Groups Name start end  sum': 0: 'G1    A   451 954 1405', 1: 'G1    B   451 951 1402', 2: 'G1    C   451 969 1420', 3: 'G1    D   463 870 1333', 4: 'G1    E   463 888 1351', 5: 'G1    X   230 450  680', 6: 'G1    Z   229 450  681', 7: 'G2    F   119 841  960', 8: 'G2    G   118 842  960', 9: 'G3    H   460 790 1250', 10: 'G3    I   123 300 177', 11: 'G4    J   343 878 1221', 12: 'G4    K   343 878 1221', 13: 'G4    L   320 862 1182'

【问题讨论】:

所以,基本上你想获得startend 值,以获得每个组中最大sum 值(列Groups)?如果是这样,请查看.groupby() 并在Groups 列上分组。然后对列sum 上的值进行排序,并取第一行(如果按降序排序)或最后一行(如果按升序排序)。此外,***.com/questions/27842613/… 可能会有所帮助 你好,没那么简单,我还需要查看每个组内start and endoverlapping intervals,然后保留longest Sum value 您如何在 F 和 G 之间做出选择?他们的总和是一样的。 您好,很抱歉,我没有提供任何关于此的信息:我接第一个。 @chippycentra For group G4 我认为应该还有一个间隔,这样start=320 end=862 【参考方案1】:

您可以按Groups 列和表示重叠范围的新列对数据框进行分组。您可以做的是首先按Groupsend(以及start,如果end 中有重复项)对数据框进行排序。

df = df.sort_values(['Groups', 'end', 'start'])

现在,既然我们知道了行的顺序,我们可以创建上面提到的附加列,我们称之为overlap

c1 = df['Groups'].shift() != df['Groups']
c2 = df['end'].shift() - df['start'] < 0
df['overlap'] = (c1 | c2).cumsum()

当前数据框:

Groups Name  start  end   sum  overlap
7      G1    Z    229  450   681        1
6      G1    X    230  450   680        1
4      G1    D    463  870  1333        2
5      G1    E    463  888  1351        2
2      G1    B    451  951  1402        2
1      G1    A    451  954  1405        2
3      G1    C    451  969  1420        2
8      G2    F    119  841   960        3
9      G2    G    118  842   960        3
11     G3    I    123  300   177        4
10     G3    H    460  790  1250        5
14     G4    L    320  862  1182        6
12     G4    J    343  878  1221        6
13     G4    K    343  878  1221        6

最后,我们使用groupby得到每个组中sum最大的行。

df.sort_values(['sum'], ascending=False).groupby('overlap').first()

结果:

        Groups Name  start  end   sum
overlap                              
1           G1    Z    229  450   681
2           G1    C    451  969  1420
3           G2    F    119  841   960
4           G3    I    123  300   177
5           G3    H    460  790  1250
6           G4    J    343  878  1221

对于选择组中sum 相同的行,可以在按sum 进行二级排序时使用附加列。例如,如果顺序应该基于行的原始顺序,则可以使用reset_index() 在开头添加一个新的index 列。

【讨论】:

以上是关于只保留熊猫坐标行中的最大间隔的主要内容,如果未能解决你的问题,请参考以下文章

如何根据熊猫时间序列中的 5 分钟间隔创建组 ID?

Excel表格纵坐标设置间隔0.5,能不能只显示整数?

echarts Y轴刻度保留小数设置,以及设置刻度间隔

壁虎的最佳时间间隔,熊猫移位的问题

熊猫将时间间隔重叠到时间序列

按间隔合并两个熊猫数据帧