pandas 在大型数据帧上应用赋值

pandas apply with assignment on large dataframe

我有一个很长的数据框 dfWeather,列 TEMP。由于它的大小,我只想保留相关信息。具体来说,只保留自上次保留的条目以来温度变化超过 1 的条目。我想使用 dfWeather.apply,因为它在行上的迭代速度(10 倍)似乎比 for 循环在 dfWeather.iloc 上快得多(10 倍)。我尝试了以下方法。

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。第一个条目始终包含在内。

如果你不想调用这个递归(所以你有 [1, 2, 3] 并且你想保留 [1, 3] 因为 2 只比 [=15= 大 1 度] 但 31 大 1 度以上,但不比 2) 比你可以简单地使用 diff.

但是,如果值保持在 1°C 阈值以下的时间更长,这将不起作用。为了克服这个限制,您可以将值四舍五入(任何精度,但 1°C 表明 zero-precision 是个好主意;))

让我们创建一个示例:

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 花费最少的 twink 时间,但比切片方式更有效。