Pandas:按相邻行差值过滤数据框
我有一个数据框,里面有以下数据。
时间戳 | 测量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