gpt4 book ai didi

python - 如何计算重叠并为 Pandas 找到重叠的伙伴?

转载 作者:行者123 更新时间:2023-11-28 22:11:27 25 4
gpt4 key购买 nike

我很困惑如何使用 pandas 最有效地做到这一点。

我有以下 pandas DataFrame,目前包含两列 startsends,代表间隔 [1, 10] [5, 15][3, 8]

import pandas as pd

dict1 = {'start': [1, 5, 3], 'end': [10, 15, 8]}

df = pd.DataFrame(dict1)
print(df)
start end
0 1 10
1 5 15
2 3 8

从 0 开始,我想计算间隔如何重叠。这是正确的合并结构(无需过多担心闭/开区间):

区间 [0, 1] 没有区间,[1,3] 有 1 个区间(来自 [1, 10]) , [3, 5] 有两个区间(一对 [1, 10][3, 8]),区间 [5, 8] 有三个区间([1, 10], [3, 8], [5, 15]), [8, 10] 有两个间隔 ([1, 10], [5, 15]),等等。

以表格形式总结结果,预期结果将是:

  start  end  total  interval
0 0 1 0 []
1 1 3 1 [[1, 10]]
2 3 5 2 [[1, 10], [3, 8]]
3 5 8 3 [[1, 10], [3, 8], [5, 15]]
4 8 10 2 [[1, 10], [5, 15]]
5 10 15 1 [[5, 15]]
6 15 75 0 []

intervals 列当前是包含每个间隔列表的列表列表。 (我包含了一个大于 15 的整数,以表明那里什么都没有;75 是任意的)

我应该如何用 Pandas 完成上述任务?这三个步骤似乎是:

(1) 将区间解构为给定任何其他区间并集的部分

(2) 计算重叠区间

(3) 存储间隔以供以后检索

pandas 是否配备了此操作?

最佳答案

pandas 0.24.0 开始,可以使用 pd.Interval.overlaps:

endpoints = df.stack().sort_values().reset_index(drop=True)
intervals = pd.DataFrame({'start':endpoints.shift().fillna(0),
'end':endpoints}).astype(int)
# construct the list of intervals from the endpoints
intervals['intv'] = [pd.Interval(a,b) for a,b in zip(intervals.start, intervals.end)]

# these are the original intervals
orig_invt = pd.arrays.IntervalArray([pd.Interval(a,b) for a,b in zip(df.start, df.end)])

# walk through the intervals and compute the intersections
intervals['total'] = intervals.intv.apply(lambda x: org_intv.overlaps(x).sum())

输出:

+----+--------+------+-----------+-------+
| | start | end | intv | total |
+----+--------+------+-----------+-------+
| 0 | 0 | 1 | (0, 1] | 0 |
| 1 | 1 | 3 | (1, 3] | 1 |
| 2 | 3 | 5 | (3, 5] | 2 |
| 3 | 5 | 8 | (5, 8] | 3 |
| 4 | 8 | 10 | (8, 10] | 2 |
| 5 | 10 | 15 | (10, 15] | 1 |
+----+--------+------+-----------+-------+

关于python - 如何计算重叠并为 Pandas 找到重叠的伙伴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681792/

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