2017-07-26 33 views
3

我有一个很大的数据集,我正试图进行进一步分析。以下是数据框的相关部分的外观。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 

我想创建一个名为期初余额新列这基本上是前一个月的月末的期末余额,所以第二行,期初余额也只是等于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做到这一点(还是很新的它)。

任何帮助表示赞赏。

我试着通过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月贷款期初余额应为150,000。 10月期初余额应为17.5万。由于我没有8月期末余额可供参考,因此9月期初余额应该与9月期初余额一样拖欠。

更新

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

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

这仍然让我的NaN九月的观察,但是这是没有问题,因为我可以做一个手动更换这些价值。

+0

到目前为止你有什么代码? –

回答

3

我建议你有另一列表示日期 - (1月),然后加入他们的日期字段,以获得期初余额。

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 
+0

感谢Santhosh,请参阅我更新的问题,试图解决您的问题。任何进一步的意见赞赏 – user2335564

+0

使用从pd.DateOffset(月= 1)日期返回日期值与月间隔。但是我们没有相同的号码。整月的日子。所以,通过日期加入他们给你NaN。因此我与月份进行了联合。 – yesemsanthoshkumar