我有一個包含大約 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。
uj5u.com熱心網友回復:
新答案
好吧,過了一段時間,我想我終于明白你在問什么了。您似乎想從本質上“壓縮”資料,以便每個時間步長的電壓差至少為 1V。
例如,從時間的電壓開始0.0,下一個電壓差至少為 1V 的電壓是時間的電壓14.0。然后,從時間的電壓開始14.0,下一個高于幅度閾值的電壓差是時間50.0。然后你從時間開始尋找50.0,依此類推。
這可以使用所謂的兩指標演算法來實作。您基本上跟蹤 - 毫不奇怪 - 兩個指標:一個固定在某個索引處,另一個從第一個指標每次遞增一個步驟。然后當滿足某些條件時,第一個指標被更新到第二個指標的位置,然后第二個指標再次開始遞增。這是一個基本的實作:
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
然后,您可以選擇電壓變化的絕對值為 的行>= 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479487.html
上一篇:列印多個隨機排列
