【问题标题】:Pandas ffill and bfill don't work together熊猫 ffill 和 bfill 不能一起工作
【发布时间】:2021-03-12 06:10:27
【问题描述】:

我无法让 bfill 和 ffill 在同一个数据集中工作。

我有一个类似于下面的合并数据集。所有行都有项目代码和日期,但在订阅开始/结束日期之前/之后记录支出的行没有订阅代码。

Project Code     Start Date     End Date     Subscription Code     Date     Recorded Spending 
   349                                                            8/1/19          50
   349             9/1/18        9/1/19          349A             3/1/19          88
   349             9/1/18        9/1/19          349A             8/1/19          
   349             9/1/19        9/1/20          349B             10/1/19         120
   349                                                            10/1/20         22

我想扩展 Subscription Code 值,以便项目正式开始之前的所有支出都计入第一个订阅码,项目正式完成后的任何支出都计入最后一个订阅码。

在我的解决方案中,我发现我可以 ffill 或 bfill - 以先到者为准。所以下面的代码会产生前向填充的订阅代码,但代码永远不会回填。

    df.sort_values(by=['Project Code','Date'], inplace=True)
    #backfill subscription code
    df.loc[:,['Subscription Code']] = df.loc[:,['Subscription Code']].ffill()
    
    #remove if the project code does not match subscription code
    df['Subscription Code'] = np.where(df['Subscription Code'].str[:3] != df['Project Code'], '', df['Subscription Code'])

    df.loc[:,['Subscription Code']] = df.loc[:,['Subscription Code']].bfill()

    #remove if the project code does not match subscription code
    df['Subscription Code'] = np.where(df['Subscription Code'].str[:3] != df['Project Code'], '', df['Subscription Code'])

如何将这些组合起来,以便既可以填充又可以填充?

【问题讨论】:

  • 在我试图弄清楚之后,我编辑了这个问题,以反映对这个问题的更好理解。

标签: python pandas


【解决方案1】:

在这种情况下,我知道第一个订阅代码将是项目代码 + 'A',因此我能够使用此代码来获得所需的内容:

def fill_empty_subscription_code(df):
    
    df.sort_values(by=['Project Code', 'Date'], inplace=True) 
    #If there is spending recorded after the last subscription end date then include it with the last subscription
    df.loc[:, 'Subscription Code'] = df.groupby(['Project Code'])['Subscription Code'].ffill()
    #If there is work done before the first subscription start date include it in the first subscription line code (denoted with the concatenated  0)
    df.loc[:, 'Subscription Code'] = np.where(pd.isna(df['Subscription Code']), 
      df['Project Code'] + 'A',
      df['Subscription Code'])
            
    return df

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2022-07-27
    • 1970-01-01
    • 2022-12-09
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多