pandas:如何删除 C1 列在容差范围内且 C2 列最大的"duplicate"行?



遵循我之前的问题:

我有一个数据帧:

load,timestamp,timestr
0,1576147339.49,124219
0,1576147339.502,124219
2,1576147339.637,124219
1,1576147339.641,124219
9,1576147339.662,124219
8,1576147339.663,124219
7,1576147339.663,124219
6,1576147339.663,124219
5,1576147339.663,124219
4,1576147339.663,124219
3,1576147339.663,124219
2,1576147339.663,124219
1,1576147339.663,124219
0,1576147339.663,124219
0,1576147339.673,124219
3,1576147341.567,124221
2,1576147341.568,124221
1,1576147341.569,124221
0,1576147341.57,124221
4,1576147341.581,124221
3,1576147341.581,124221

我想删除"时间戳"列中所有在一定容差范围内的行,除了具有最大"负载"列的行。

在上面的例子中,如果tolerance=0.01,那会给我们留下

load,timestamp,timestr
0,1576147339.49,124219
0,1576147339.502,124219
2,1576147339.637,124219
9,1576147339.662,124219
0,1576147339.673,124219
3,1576147341.567,124221
4,1576147341.581,124221

"负载"的最大值不一定是第一个!

Idea 是将值四舍五入的值乘以>1 乘以tolerance除以1并传递给 groupby 以进行聚合max

tolerance=0.01
df = df.groupby(df['timestamp'].mul(1/tolerance).round()).max().reset_index(drop=True)
print (df)
load     timestamp  timestr
0     0  1.576147e+09   124219
1     0  1.576147e+09   124219
2     2  1.576147e+09   124219
3     9  1.576147e+09   124219
4     0  1.576147e+09   124219
5     3  1.576147e+09   124221
6     4  1.576147e+09   124221

舍入容易受到这样的问题的影响,因此可能存在 2 行,带小数部分,例如0.4940.502。 第一个将四舍五入为0.49,第二个将四舍五入为0.50, 所以他们将在不同的组中,尽管事实上 它们之间的距离小于0.01

所以我的建议是做这项工作(计算结果数据帧( 通过迭代:

result = pd.DataFrame(columns=df.columns)
wrk = df.sort_values('timestamp')
threshold = 0.01
while wrk.index.size > 0:
tMin = wrk.iloc[0, 1]  # min timestamp
grp = wrk[wrk.timestamp <= tMin + threshold]
row = grp.nlargest(1, 'load')  # max load
result = result.append(row)
wrk.drop(grp.index, inplace=True)

为了确认我最初的评论,请将第一行时间戳的小数部分更改为0.494。 为了可读性,我还"缩短"了整数部分。

我的解决方案返回:

load  timestamp timestr
0     0   7339.494  124219
2     2   7339.637  124219
4     9   7339.662  124219
14    0   7339.673  124219
15    3   7341.567  124221
19    4   7341.581  124221

而另一个解决方案返回:

load  timestamp  timestr
0     0   7339.494   124219
1     0   7339.502   124219
2     2   7339.641   124219
3     9   7339.663   124219
4     0   7339.673   124219
5     3   7341.570   124221
6     4   7341.581   124221

最新更新