Python中的索引匹配等价物

Posted

技术标签:

【中文标题】Python中的索引匹配等价物【英文标题】:Index match equivalent in Python 【发布时间】:2018-01-02 03:40:11 【问题描述】:

我有一个大型数据集,我正试图对其进行操作以进行进一步分析。下面是数据框的相关部分的样子。

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 年 9 月 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 月的观察都会得到 NaN。 11 月贷款 1 的期初余额应为 150,000。 10 月期初余额应为 175,000。并且 9 月期初余额应该默认与 9 月期初余额相同,因为我没有 8 月期末余额可供参考。

更新

我认为我解决了问题,我将合并代码更改为:

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

这仍然让我在 9 月的观察中得到 NaN,但这很好,因为我可以手动替换这些值。

【问题讨论】:

到目前为止你有什么代码? 【参考方案1】:

我建议您有另一列显示日期 -(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,请查看我更新后的问题以及我对您的解决方案的尝试。任何进一步的 cmet 表示赞赏 使用 pd.DateOffset(month=1) 中的日期返回带有月份间隔的日期值。但是我们没有相同的没有。整个月的天数。所以,按日期加入他们会给你 NaN。因此我加入了月份。

以上是关于Python中的索引匹配等价物的主要内容,如果未能解决你的问题,请参考以下文章

列表列表中的匹配索引 - 字典 - python

R中Excel中索引匹配的等价物

比较python中的两个列表并返回匹配值的索引

python中的对向量

具有任意索引的 Python 列表切片

Scala 中的 x[i:] 等价物是啥? [复制]