【问题标题】:generate rows with ffill based on specific condition - pandas根据特定条件生成具有 ffill 的行 - pandas
【发布时间】:2020-08-25 03:51:19
【问题描述】:

我有一个如下所示的df

Date                   B_best         B_worst     W_best            W_worst
2020-08-11             3              1           10                7
2020-08-12             3              1           10                7
2020-08-13             3              1           10                7
2020-08-14             3              1           10                7
2020-08-15             6              1           10                7
2020-08-16             6              2           10                11
2020-08-17             6              2           5                 11
2020-08-18             6              2           5                 11
2020-08-19             9              2           5                 11
2020-08-20             9              2           4                 11
2020-08-21             9              2           4                 11   
2020-08-22             5              3           7                 13         
2020-08-23             10             6           8                 16 
2020-08-24             9              2           4                 11

df 上面有一个名为Date 的列我想要一个函数,其输入将高于 df 和一个日期值

df1 = generate_data(df, datetime.datetime(2020, 9, 2, 20, 0))

其中 datetime.datetime(2020, 9, 2, 20, 0) 表示 2020-09-02

预期输出

df1:

Date                   B_best         B_worst     W_best            W_worst
2020-08-11             3              1           10                7
2020-08-12             3              1           10                7
2020-08-13             3              1           10                7
2020-08-14             3              1           10                7
2020-08-15             6              1           10                7
2020-08-16             6              2           10                11
2020-08-17             6              2           5                 11
2020-08-18             6              2           5                 11
2020-08-19             9              2           5                 11
2020-08-20             9              2           4                 11
2020-08-21             9              2           4                 11   
2020-08-22             5              3           7                 13         
2020-08-23             10             6           8                 16 
2020-08-24             9              2           4                 11
2020-08-25             9              2           4                 11
2020-08-26             9              2           4                 11
2020-08-27             9              2           4                 11
2020-08-28             9              2           4                 11
2020-08-29             9              2           4                 11
2020-08-30             9              2           4                 11
2020-08-31             9              2           4                 11
2020-09-01             9              2           4                 11
2020-09-02             9              2           4                 11

它已经生成了截至 2020-09-02 的数据,并且可用 df 的最后一行的值相同。

注意:

如果输入日期大于最大日期则返回df1,否则返回df

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    假设日期是连续的,并且输入日期将始终大于数据框中可用的最小日期,您可以使用现有 min 列中的 min 创建一个 date_range 系列,然后 right 合并通过填充:

    def generate_data(a,b):
        idx = pd.date_range(a['Date'].min(),b)
        return a.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(a.dtypes)
    print(generate_data(df, datetime.datetime(2020, 9, 2, 20, 0)))
    

    编辑1: 如果输入日期小于最小日期,则调整并返回原始df,您可以编辑函数:

    def generate_data(a,b):
        idx = pd.date_range(a['Date'].min(),b)
        out = a.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(a.dtypes)
        return a if b<a['Date'].min() else out
    

    EDIT2:

    如果输入日期大于最大日期,则返回df1,否则返回df。

    def generate_data(df, b):
        if df['Date'].max() <  b:
            idx = pd.date_range(df['Date'].min(),b)
            return df.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(df.dtypes)
        else:
            return df
    

             Date  B_best  B_worst  W_best  W_worst
    0  2020-08-11       3        1      10        7
    1  2020-08-12       3        1      10        7
    2  2020-08-13       3        1      10        7
    3  2020-08-14       3        1      10        7
    4  2020-08-15       6        1      10        7
    5  2020-08-16       6        2      10       11
    6  2020-08-17       6        2       5       11
    7  2020-08-18       6        2       5       11
    8  2020-08-19       9        2       5       11
    9  2020-08-20       9        2       4       11
    10 2020-08-21       9        2       4       11
    11 2020-08-22       5        3       7       13
    12 2020-08-23      10        6       8       16
    13 2020-08-24       9        2       4       11
    14 2020-08-25       9        2       4       11
    15 2020-08-26       9        2       4       11
    16 2020-08-27       9        2       4       11
    17 2020-08-28       9        2       4       11
    18 2020-08-29       9        2       4       11
    19 2020-08-30       9        2       4       11
    20 2020-08-31       9        2       4       11
    21 2020-09-01       9        2       4       11
    22 2020-09-02       9        2       4       11
    

    【讨论】:

    • 如果输入日期小于最小日期,则原样返回 df。代码不应中断。
    • @Danish 它不会中断,但会返回一个空数据帧,用 generate_data(df, datetime.datetime(2020, 8, 2, 20, 0)) 测试过
    • 在这种情况下我们可以让它返回初始的df
    • @Danish 我希望你尝试一下 :)(这是一个条件检查)如果你遇到问题,请告诉我我会帮助你。!!
    • 我试过这个 def generate_data(a,b): if a['Date'].max()
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2022-11-13
    • 2020-08-13
    • 2019-04-18
    • 2023-01-13
    相关资源
    最近更新 更多