如何压缩数据帧,使行与行之间的差异至少达到某个阈值

How to compress a dataframe so that the row-to-row difference is at least some threshold in magnitude

我有一个包含大约 7000 行和 2 列的 DataFrame,如下所示:

    Time    Voltage
0    0.0  32.965541
1    0.5  32.914965
2    1.0  32.904850
3    1.5  32.864389
4   14.0  31.680907
5   24.0  31.023417
6   24.5  31.003186
7   25.0  30.982956
8   25.5  30.942495
9   26.0  30.952610
10  50.0  30.062469
11  50.5  30.022009
12  56.0  29.961317
13  56.5  29.941087
14  57.0  29.930971
15  57.5  29.910741
16  58.0  29.890511
17  73.0  21.211641
18  73.5  21.181296
19  74.0  21.201526
20  87.5  21.120604
21  88.0  21.080143
22  88.5  21.110489

我想将数据帧“压缩”到仅对应于从一个步骤到下一个步骤的电压差幅度至少为一伏的时间步长。

例如,从时间0.0开始,下一个幅度相差至少一伏的电压在时间14.0。然后,从时间 14.0 开始,下一个幅度差异至少为一伏特的电压在时间 50.0.

新答案

好的,过了一段时间,我想我终于明白你在问什么了。似乎您想从本质上“压缩”数据,以便 每个按时间顺序排列的时间步长的电压差异幅度至少为 1V

例如,从0.0时刻的电压开始,下一个至少相差1V量级的电压就是14.0时刻的电压。然后,从时间 14.0 的电压开始,下一个高于幅度阈值的电压差是时间 50.0。然后你从时间50.0开始找,以此类推。

这可以使用所谓的 two-pointer 算法来实现。您本质上跟踪 - 毫不奇怪 - 两个指针:一个固定在某个索引处,另一个从第一个指针开始递增一步。然后当满足某些条件时,第一个指针更新为第二个指针的位置,然后第二个指针再次开始递增。这是一个基本的实现:

def compress(x, thresh=1):
    i, j, idxs = 0, 1, [0]
    while j < len(x):
        if abs(x[i] - x[j]) >= thresh:
            idxs.append(j)
            i = j
        j += 1
    return idxs

其中,当从数据框中传递 Voltage 列时会产生以下结果:

In [26]: df.iloc[compress(df.Voltage, 1), :]
Out[26]:
    Time    Voltage
0    0.0  32.965541
4   14.0  31.680907
10  50.0  30.062469
17  73.0  21.211641

旧答案

我会保留这个旧答案,以便未来的读者仍能从中受益。

您可以使用 .diff():

从上面的一行中获取零钱
In [7]: df["deltaVoltage"] = df["Voltage"].diff()

In [8]: df
Out[8]:
    Time    Voltage  deltaVoltage
0    0.0  32.965541           NaN
1    0.5  32.914965     -0.050576
2    1.0  32.904850     -0.010115
3    1.5  32.864389     -0.040461
4   14.0  31.680907     -1.183482
5   24.0  31.023417     -0.657490
6   24.5  31.003186     -0.020230
7   25.0  30.982956     -0.020230
8   25.5  30.942495     -0.040461
9   26.0  30.952610      0.010115
10  50.0  30.062469     -0.890140
11  50.5  30.022009     -0.040461
12  56.0  29.961317     -0.060691
13  56.5  29.941087     -0.020230
14  57.0  29.930971     -0.010115
15  57.5  29.910741     -0.020230
16  58.0  29.890511     -0.020230
17  73.0  21.211641     -8.678869
18  73.5  21.181296     -0.030346
19  74.0  21.201526      0.020230
20  87.5  21.120604     -0.080922
21  88.0  21.080143     -0.040461
22  88.5  21.110489      0.030346

然后,您可以select电压变化的绝对值为>= 1:

的行
In [9]: df[df["deltaVoltage"].abs() >= 1]
Out[9]:
    Time    Voltage  deltaVoltage
4   14.0  31.680907     -1.183482
17  73.0  21.211641     -8.678869

或者,如果您实际上不想将电压变化保存为一列:

In [10]: df[df["Voltage"].diff().abs() >= 1]
Out[10]:
    Time    Voltage
4   14.0  31.680907
17  73.0  21.211641