如何压缩数据帧,使行与行之间的差异至少达到某个阈值
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
我有一个包含大约 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