熊猫填充和填充无法一起使用

时间:2020-10-06 15:50:44

标签: python pandas

我无法在同一数据集中进行填充和填充工作。

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

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

我想扩展订购代码值,以便将在项目正式开始之前的所有支出都计入第一个订购代码,并将在项目正式完成之后的所有支出均计入最后一个订购代码。

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

    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'])

如何将它们组合在一起,以便既可以填充又可以填充?

1 个答案:

答案 0 :(得分:0)

在这种情况下,我知道第一个订阅代码将是项目代码 + '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