【发布时间】: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'])
如何将这些组合起来,以便既可以填充又可以填充?
【问题讨论】:
-
在我试图弄清楚之后,我编辑了这个问题,以反映对这个问题的更好理解。