如何合并pandas数据框中的重叠间隔并计算合并次数



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

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时间戳。如何合并重叠的时间间隔并记录每个时间间隔的合并次数?例如,在上面的例子中,第二行和倒数第二行应该合并成一个音程,它们的分数应该合并,即0.6 + 0.7 = 1.3,count应该为2(合并的音程数)。

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

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

代码:

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

相关内容

  • 没有找到相关文章