python - 如何合并熊猫数据框中的重叠间隔并计算合并次数
问题描述
我有一个看起来像这样的数据框。
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 时间戳。如何合并重叠的时间间隔并计算每个间隔的合并次数?例如,在上面的示例中,第 2 行和倒数第 2 行应该合并为一个区间,它们的分数应该合并,即 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
推荐阅读
- javascript - javascript prettier 多行格式化对象
- php - 流元素 PUT 请求
- angular - 预选和更新角材料选择列表
- functional-programming - javascript折叠减少函数式编程
- c++ - QMainWindow上使用样式表的Qt 5.10半透明背景
- angular - 尝试链接到当前页面中的部分时不是有效的选择器错误
- r - 矢量化 R 中的图例
- python - 如何在 matplotlib 中使用 Humor Sans?
- python - 3D 点云图
- javascript - Socket.io 向所有客户端发出消息,但最初发出原始消息的客户端除外