gpt4 book ai didi

python - 按重叠范围对行进行分组

转载 作者:太空狗 更新时间:2023-10-30 02:25:42 28 4
gpt4 key购买 nike

我有一个数据框,其中 left 列是对象最左边的位置,right 列是最右边的位置。如果对象重叠,或者它们重叠重叠的对象(递归),我需要对它们进行分组。因此,例如,如果这是我的数据框:

     left  right
0 0 4
1 5 8
2 10 13
3 3 7
4 12 19
5 18 23
6 31 35

所以行 03 重叠 - 因此它们应该在同一组中,而且行 1 与行 重叠3 - 因此它加入了组。

所以,对于这个例子,输出应该是这样的:

     left  right    group
0 0 4 0
1 5 8 0
2 10 13 1
3 3 7 0
4 12 19 1
5 18 23 1
6 31 35 2

我想了各种方向,但没有弄清楚(没有丑陋的for)。任何帮助将不胜感激!

最佳答案

我发现公认的解决方案(更新:现已删除)具有误导性,因为它无法推广到类似情况。例如对于以下示例:

df = pd.DataFrame({'left': [0,5,10,3,12,13,18,31], 
'right':[4,8,13,7,19,16,23,35]})
df

建议的聚合函数输出以下数据帧(请注意,18-23 应与 12-19 一起在组 1 中)。

enter image description here

一种解决方案是使用以下方法(基于组合区间的方法 posted by @CentAu ):

# Union intervals by @CentAu
from sympy import Interval, Union
def union(data):
""" Union of a list of intervals e.g. [(1,2),(3,4)] """
intervals = [Interval(begin, end) for (begin, end) in data]
u = Union(*intervals)
return [u] if isinstance(u, Interval) \
else list(u.args)

# Create a list of intervals
df['left_right'] = df[['left', 'right']].apply(list, axis=1)
intervals = union(df.left_right)

# Add a group column
df['group'] = df['left'].apply(lambda x: [g for g,l in enumerate(intervals) if
l.contains(x)][0])

...输出:

enter image description here

关于python - 按重叠范围对行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48243507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com