我有一个大型数据集,想要进行进一步的分析。以下是数据帧的相关部分:
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
我想创建一个名为“期初余额”的新列,它基本上是上个月月末的“期末余额”,因此对于第二行,“期初余额”将等于175,000,这是第一行的“期末余额”。
由于数据集始于2010-10-31,我无法查找2010-09-30的余额,因此对于任何日期为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中实现(我对Python还很陌生)。
感谢任何帮助。
我尝试了Santhosh建议的方法,结果如下:
谢谢,我尝试了您的解决方案,结果如下:
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
我随后修改了该代码,以基于贷款ID和日期/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
在这种情况下,我不确定为什么每个11月份的观察值都会得到NaN。Loan 1在11月份的期初余额应该是150,000。10月份的期初余额应该是175,000。由于我没有8月份的结转余额可供参考,因此9月份的期初余额应该默认为与9月份相同。
更新
我想我解决了这个问题,我把合并代码改成了:
final_df = pd.merge(df, df, how="left", left_on=['Loan','pDate'], right_on=['Loan','Date'])
这仍然会使我在9月份的观测值中获得NaN,但这没关系,因为我可以手动替换这些值。