我无法在同一数据集中进行填充和填充工作。
我有一个与下面相似的合并数据集。所有行都有项目代码和日期,但是在预订的开始/结束日期之前/之后记录支出的行没有预订代码。
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'])
如何将它们组合在一起,以便既可以填充又可以填充?
答案 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