我有一个看起来像这样的数据框架。
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
start
和end
列只是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