【问题标题】:Combination of offset, lookup, and apply in a pandas dataframe在 pandas 数据帧中组合偏移、查找和应用
【发布时间】:2021-10-16 04:20:28
【问题描述】:

我有一个 pandas 数据框 df 有两列:日期和价格。对于每一行,我想将日期偏移 3 天,然后找到该日期的价格并填充列 price_new。请注意,日期不一定按顺序不完整。查看所需的输出:

df_new =
date       price price_new 
2021-01-01 37    N/A
2021-01-05 38    9
2021-01-06 35    42
2021-01-07 9     11
2021-01-08 11    ...
2021-01-11 42
2021-01-12 11

...

数据框df:

import pandas as pd
import numpy as np

np.random.seed(50)
start_date = "2021-01-01"
end_date= "2021-01-31"
date_range = pd.bdate_range(start=start_date,end=end_date) 
df = pd.DataFrame({'date':date_range, 'price':np.random.randint(5, 50, len(date_range))})

提前致谢!

【问题讨论】:

    标签: python pandas apply lookup offset


    【解决方案1】:

    IIUC,你可以先resample确保你有每天,然后使用shift()

    new_df = df.set_index("date").resample("D").last().reset_index()
    new_df["price_new"] = new_df["price"].shift(-3)
    new_df = new_df[new_df["date"].isin(df["date"])].reset_index(drop=True)
    
    >>> new_df
            date  price  price_new
    0 2021-01-01   37.0        NaN
    1 2021-01-05   38.0       11.0
    2 2021-01-06   35.0        NaN
    3 2021-01-07    9.0        NaN
    4 2021-01-08   11.0       42.0
    5 2021-01-11   42.0        NaN
    6 2021-01-12   11.0        NaN
    

    df 已使用:

    >>> df
            date  price
    0 2021-01-01     37
    1 2021-01-05     38
    2 2021-01-06     35
    3 2021-01-07      9
    4 2021-01-08     11
    5 2021-01-11     42
    6 2021-01-12     11
    

    【讨论】:

    • 谢谢,shift 在日期列完整时有效,但在其他情况下无效(例如,如果有假期并省略)。如果日期不完整,并且有时我想按 #of 天而不是工作日移动,我正在寻找一种强大的解决方案。
    • @Ana - 编辑为工作日和日常提供解决方案。
    • 谢谢,请看我的例子:如果您删除日期 01-04,您的代码将无法按预期工作。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2018-05-08
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多