只保留熊猫坐标行中的最大间隔
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.start
和 df.end
在行之间重叠),我解释说:
例如,在G1中有2个区间组:
间隔 1(使用 min = 451
和 max = 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 = 229
和max = 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'
【问题讨论】:
所以,基本上你想获得start
和end
值,以获得每个组中最大sum
值(列Groups
)?如果是这样,请查看.groupby()
并在Groups
列上分组。然后对列sum
上的值进行排序,并取第一行(如果按降序排序)或最后一行(如果按升序排序)。此外,***.com/questions/27842613/… 可能会有所帮助
你好,没那么简单,我还需要查看每个组内start and end
的overlapping intervals
,然后保留longest Sum value
。
您如何在 F 和 G 之间做出选择?他们的总和是一样的。
您好,很抱歉,我没有提供任何关于此的信息:我接第一个。
@chippycentra For group G4
我认为应该还有一个间隔,这样start=320 end=862
【参考方案1】:
您可以按Groups
列和表示重叠范围的新列对数据框进行分组。您可以做的是首先按Groups
和end
(以及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
列。
【讨论】:
以上是关于只保留熊猫坐标行中的最大间隔的主要内容,如果未能解决你的问题,请参考以下文章