Python中类似于Index Match的函数

3

我有一个大型数据集,想要进行进一步的分析。以下是数据帧的相关部分:

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,但这没关系,因为我可以手动替换这些值。

你目前有什么代码? - Sumner Evans
1个回答

2
我建议您再添加一列,标为日期 - (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

谢谢Santhosh,请查看我更新的问题,并尝试了您的解决方案。欢迎提出进一步的评论。 - user2335564
使用pd.DateOffset(month=1)中的日期返回具有月间隔的日期值。但是,我们并不是所有月份都有相同数量的天数。因此,通过日期将它们连接在一起会得到NaN。因此,我使用了月份进行连接。 - yesemsanthoshkumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接