首页 > 解决方案 > 如何合并熊猫数据框中的重叠间隔并计算合并次数

问题描述

我有一个看起来像这样的数据框。

      start          end         score        machine
0  1631816145    1631816312       0.5            1
1  1631817088    1631817228       0.6            1
2  1631819637    1631819844       0.2            1
3  1631816844    1631817030       0.7            2
4  1631817073    1631817225       0.4            2
5  1631818103    1631818261       0.7            2

startend列只是 unix 时间戳。如何合并重叠的时间间隔并计算每个间隔的合并次数?例如,在上面的示例中,第 2 行和倒数第 2 行应该合并为一个区间,它们的分数应该合并,即 0.6 + 0.7 = 1.3,并且count应该是 2(合并的区间数)。

最后,我想保留大多数机器中出现的重叠间隔。

标签: pythonpandas

解决方案


我采用了另一个非常好的答案中的方法来确定使用查找表的值的范围。它处理问题中给出的样本数据。

代码:

 df = pd.read_excel('Miscel.xlsx',sheet_name='Sheet3') df

输出:

start   end score   machine
0   1631816145  1631816312  0.5 1
1   1631817088  1631817228  0.6 1
2   1631819637  1631819844  0.2 1
3   1631816844  1631817030  0.7 2
4   1631817073  1631817225  0.4 2
5   1631818103  1631818261  0.7 2

代码:

s1 = df['start'].to_numpy()
s2 = df['start'].to_numpy()[:,None]
e1 = df['end'].to_numpy()
e2 = df['end'].to_numpy()[:,None]

代码:

a = (s1 >= s2) & (s1 <= e2)   # start between another start/end
a

输出:

array([[ True, False, False, False, False, False],
       [False,  True, False, False, False, False],
       [False, False,  True, False, False, False],
       [False, False, False,  True, False, False],
       [False,  True, False, False,  True, False],
       [False, False, False, False, False,  True]])

代码:

b = (e1 >= e2)  # end start another end
b

输出:

array([[ True,  True,  True,  True,  True,  True],
       [False,  True,  True, False, False,  True],
       [False, False,  True, False, False, False],
       [False,  True,  True,  True,  True,  True],
       [False,  True,  True, False,  True,  True],
       [False, False,  True, False, False,  True]])

代码:

c = a & b     #  AND logic => start between another start/end and end after end
c

输出:

array([[ True, False, False, False, False, False],
       [False,  True, False, False, False, False],
       [False, False,  True, False, False, False],
       [False, False, False,  True, False, False],
       [False,  True, False, False,  True, False],
       [False, False, False, False, False,  True]])

代码:

d = c | c.T  # create mask for calculating scores
d

输出:

array([[ True, False, False, False, False, False],
       [False,  True, False, False,  True, False],
       [False, False,  True, False, False, False],
       [False, False, False,  True, False, False],
       [False,  True, False, False,  True, False],
       [False, False, False, False, False,  True]])

代码:

e = d.sum(axis=1)   # calculate count 
e

输出:

array([1, 2, 1, 1, 2, 1])

代码:

df['count'] = e
df

输出:

    start   end score   machine count
0   1631816145  1631816312  0.5 1   1
1   1631817088  1631817228  0.6 1   2
2   1631819637  1631819844  0.2 1   1
3   1631816844  1631817030  0.7 2   1
4   1631817073  1631817225  0.4 2   2
5   1631818103  1631818261  0.7 2   1

代码:

score1 = (df['score'].to_numpy() * (c | c.T)).sum(axis=1)   

代码:

df['score1'] = score1
df

输出:

    start   end score   machine count   score1
0   1631816145  1631816312  0.5 1   1   0.5
1   1631817088  1631817228  0.6 1   2   1.0
2   1631819637  1631819844  0.2 1   1   0.2
3   1631816844  1631817030  0.7 2   1   0.7
4   1631817073  1631817225  0.4 2   2   1.0
5   1631818103  1631818261  0.7 2   1   0.7

推荐阅读