查找pandas Dataframe 中相隔一定时间的最后一个元素

3wabscal  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(139)

我有一个巨大的pandas数据框,有两列timevalue。为了简单起见,timevalue是整数。我指定了数字\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个观察中找到所需的元素,否则我的代码只会花费太多时间。

rfbsl7qr

rfbsl7qr1#

使用merge_asof

df['latest_value'] = pd.merge_asof(df, df.eval('time=time+10'), on='time')['value_y']

输出:

time  value  latest_value
0    10      0           NaN
1    15      1           NaN
2    16      2           NaN
3    20      3           0.0
4    25      4           1.0
5    36      5           4.0
6    41      6           4.0
rxztt3cl

rxztt3cl2#

正如评论系列中所建议的那样,searchsorted解决了这个问题。

相关问题