Python中的索引匹配等效

我有一个很大的数据集,我试图进行进一步的分析。 以下是数据框的相关部分的外观。

Loan Closing Balance Date 1 175,000 2010-10-31 1 150,000 2010-11-30 1 125,000 2010-12-31 2 275,000 2010-10-31 2 250,000 2010-11-30 2 225,000 2010-12-31 3 375,000 2010-10-31 3 350,000 2010-11-30 3 320,000 2010-12-31 

我想创build一个名为“期初余额”的新栏,基本上是上个月月末的期末余额,因此对于第二行,期初余额仅等于175,000,即第一行的期末余额。

当数据集从2010年10月31日开始,我将无法查找2010-09-30的余额,因此对于date为2010-10-31的任何一行,我想要为观察结果等于期末余额。

这应该是这样的:

 Loan Closing Balance Date Opening Balance 1 175,000 2010-10-31 175,000 1 150,000 2010-11-30 175,000 1 125,000 2010-12-31 150,000 2 275,000 2010-10-31 275,000 2 250,000 2010-11-30 275,000 2 225,000 2010-12-31 250,000 3 375,000 2010-10-31 375,000 3 350,000 2010-11-30 375,000 3 320,000 2010-12-31 350,000 

在Excel中,我通常会做一个复合索引匹配抛出一个eomonth函数来做到这一点,但不太确定如何在Python中做到这一点(还是很新的)。

任何帮助赞赏。

我已经尝试了Santhoshbuild议的方法,我得到以下内容:

谢谢我试过你的解决scheme,最终得到以下内容:

  Closing Balance_x Date_x Closing Balance_y 0 175000 2010-09-30 150000.0 1 175000 2010-09-30 250000.0 2 175000 2010-09-30 350000.0 3 150000 2010-10-31 125000.0 4 150000 2010-10-31 225000.0 5 150000 2010-10-31 320000.0 6 125000 2010-11-30 NaN 7 275000 2010-09-30 150000.0 8 275000 2010-09-30 250000.0 9 275000 2010-09-30 350000.0 10 250000 2010-10-31 125000.0 11 250000 2010-10-31 225000.0 12 250000 2010-10-31 320000.0 13 225000 2010-11-30 NaN 14 375000 2010-09-30 150000.0 15 375000 2010-09-30 250000.0 16 375000 2010-09-30 350000.0 17 350000 2010-10-31 125000.0 18 350000 2010-10-31 225000.0 19 350000 2010-10-31 320000.0 20 320000 2010-11-30 NaN 

然后,我修改了该代码,根据Loan ID和Date / pDate进行合并:

 final_df = pd.merge(df, df, how="left", left_on=['Date'], right_on=['pDate']) Loan Closing Balance_x Date_x Opening Balance 0 1 175000 2010-09-30 150000.0 1 1 150000 2010-10-31 125000.0 2 1 125000 2010-11-30 NaN 3 2 275000 2010-09-30 250000.0 4 2 250000 2010-10-31 225000.0 5 2 225000 2010-11-30 NaN 6 3 375000 2010-09-30 350000.0 7 3 350000 2010-10-31 320000.0 8 3 320000 2010-11-30 NaN 

现在在这种情况下,我不清楚为什么每个十一月份的观察都能得到NaN。 十一月份贷款一期的期初余额应该是15万。 10月份期初余额应该是17.5万。 9月份的期初余额应该是9月份的期初余额,因为我没有8月份的期末余额可供参考。

更新

认为我解决了这个问题,我改变了合并代码:

 final_df = pd.merge(df, df, how="left", left_on=['Loan','pDate'], right_on=['Loan','Date']) 

9月份的观测数据还是让我觉得不错,但是我可以手动取代这些数值。

我build议你有另一个栏目说date – (1个月),然后join他们的date字段,以获得期初余额。

 df["cmonth"] = df.Date.apply(lambda x: x.year*100+x.month) df["pDate"] = df.Date.apply(lambda x: (x - pd.DateOffset(months=1))) df["pmonth"] = df.pDate.apply(lambda x: x.year*100+x.month) final_df = pd.merge(df, df, how="left", left_on="cmonth", right_on="pmonth") print(final_df[["close_x", "Date_x", "close_y"]]) #close_y is your opening balance