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 度] 但 3
比 1
大 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 时间,但比切片方式更有效。
我有一个很长的数据框 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 度] 但 3
比 1
大 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 时间,但比切片方式更有效。