Pandas:按相邻行差值过滤数据框

3 投票
1 回答
52 浏览
提问于 2025-04-14 17:49

我有一个数据框,里面有以下数据。

时间戳 测量A 测量B 测量C 测量D
0.00 26.46 63.60 3.90 0.67
0.94 26.52 78.87 1.58 0.42
1.94 30.01 82.04 1.13 0.46
3.00 30.19 82.00 1.17 0.36
4.00 30.07 81.43 1.13 0.42
5.94 30.02 82.46 1.05 0.34
8.00 30.22 82.48 0.98 0.35
9.00 30.00 82.21 1.13 0.33
10.00 30.00 82.34 1.12 0.34

我想用一些不均匀的间隔来过滤这些数据。假设我的间隔是 [1.0, 1.5]

我想要实现的是,从第一行(row0)开始,找到下一个有效的行。我们要找的是下一个时间戳大于或等于 row0 + 1.0 的行。

在这个例子中,下一个有效的行是时间戳为 1.94 的那一行。接下来,我们会用间隔数组中的下一个值,也就是 1.5。这样下一个行就是时间戳为 4.00 的那一行,因为 1.94 + 1.5 等于 3.44

对于下一行,我们会回到间隔数组的开头重新开始。

经过所有数据处理后,得到的数据框应该是:

时间戳 测量A 测量B 测量C 测量D
0.00 26.46 63.60 3.90 0.67
1.94 30.01 82.04 1.13 0.46
4.00 30.07 81.43 1.13 0.42
5.94 30.02 82.33 1.11 0.35
8.00 30.22 82.48 0.98 0.35
9.00 30.00 82.21 1.13 0.33

有没有办法用 pandas 中现有的过滤方法来实现这个?

1 个回答

3

试试这个:

from itertools import cycle

# the interval:
A, B = 1.0, 1.5

comparing, out, last_t = cycle([B, A]), [], float("-inf")
j = next(comparing)

for i, t in zip(df.index, df.Timestamp):
    if t >= last_t + j:
        out.append(i)
        last_t = t
        j = next(comparing)

print(df.loc[out])

输出结果是:

   Timestamp  MeasureA  MeasureB  MeasureC  MeasureD
0       0.00     26.46     63.60      3.90      0.67
2       1.94     30.01     82.04      1.13      0.46
4       4.00     30.07     81.43      1.13      0.42
5       5.94     30.02     82.46      1.05      0.34
6       8.00     30.22     82.48      0.98      0.35
7       9.00     30.00     82.21      1.13      0.33

撰写回答