dfWeather我的列有一個很長的資料框TEMP。由于它的大小,我只想保留相關資訊。具體來說,只保留與我上次保存的條目相比溫度變化超過 1 的條目。我想使用dfWeather.apply,因為它在行上的迭代速度(10 倍)似乎比for-loop over快得多dfWeather.iloc。我嘗試了以下。
dfTempReduced = pd.DataFrame(columns = dfWeather.columns)
dfTempReduced.append(dfWeather.iloc[0])
dfWeather.apply(lambda x: dfTempReduced = dfTempReduced.append(x) if np.abs(TempReduced[-1].TEMP - x.TEMP) >= 1 else None, axis = 1)
不幸的是我得到了錯誤
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
有沒有一種快速的方法來獲得想要的結果?謝謝!
編輯:這是一些示例資料
dfWeather[200:220].TEMP
Out[208]:
200 12.28
201 12.31
202 12.28
203 12.28
204 12.24
205 12.21
206 12.17
207 11.93
208 11.83
209 11.76
210 11.66
211 11.55
212 11.48
213 11.43
214 11.37
215 11.33
216 11.36
217 11.33
218 11.29
219 11.27
所需的結果將僅產生第一個和最后一個條目,因為絕對差大于 1。始終包括第一個條目。
uj5u.com熱心網友回復:
如果你不想呼叫這個遞回(所以你有[1, 2, 3]并且你想保留[1, 3],因為2它只比 1 度大,1但3比 1 度大1,但不比2)比你可以簡單地使用diff.
但是,如果值在 1°C 閾值以下保持較長時間,則此方法不起作用。為了克服這個限制,您可以將值四舍五入(到任何精度,但 1°C 表明零精度是個好主意;))
讓我們創建一個示例:
import pandas as pd
import numpy as np
df = pd.DataFrame()
df['TEMP'] = np.random.rand(100) * 2
所以現在如果你可以使用diff它,只需通過以下方式非常有效地完成:
# either slice
lg = df['TEMP'].apply(round).diff().abs() > 1
df = df[lg]
# or drop
lg = df['TEMP'].apply(round).diff().abs() < 1
df.drop(index=lg.index, inplace=True)
你甚至有兩種選擇來減少。我想這drop需要更長的時間,但比切片方式更節省記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478498.html
