我有一个巨大的pandas数据框,有两列time和value。为了简单起见,time和value是整数。我指定了数字\delta t。我需要创建一个新列latest_value,它将包含value列中的元素,使得它的time是小于或等于time - \delta t的最大时间。
例如,如果**\delta t=10**,则 Dataframe 由下式给出:
| 时间|价值|
| --------------|--------------|
| 10个|0|
| 十五岁|1|
| 十六岁|第二章|
| 二十|三|
| 二十五|四|
| 三十六|五|
| 四十一|六|
应输出
| 时间|价值|最新值|
| --------------|--------------|--------------|
| 10个|0|南|
| 十五岁|1|南|
| 十六岁|第二章|南|
| 二十|三|0|
| 二十五|四|1|
| 三十六|五|四|
| 四十一|六|四|
time列已排序。
我知道滚动窗口的解决方案,但它需要太多时间。
def latest_value_Xms_apart(timestamps, values, lag=0.05):
current_timestamp = timestamps.iloc[-1]
mask = (current_timestamp - timestamps) >= lag
if mask.any():
latest_value = values[mask].iloc[-1]
return latest_value
else:
return np.nan
df['latest_value'] = df['timestamp'].rolling(window=100, min_periods=1).apply(
lambda x: latest_value_Xms_apart(x, df.loc[x.index, 'value']), raw=False
)
这里我假设我们总是可以在感兴趣的元素之前的最后100个观察中找到所需的元素,否则我的代码只会花费太多时间。
2条答案
按热度按时间rfbsl7qr1#
使用
merge_asof
:输出:
rxztt3cl2#
正如评论系列中所建议的那样,searchsorted解决了这个问题。