【问题标题】:find recurring payments that occur within a time frame monthly in pandas在 pandas 中查找每月某个时间范围内发生的定期付款
【发布时间】:2021-12-26 17:50:39
【问题描述】:

我有一个数据框,我想查找相同 ID 的定期付款(仅当金额相同且月份中的某天相同且存在误差(+-5 天)时。 我做了以下事情:

d = {'id':[1,1,1,3,3,3,5,5,5],
    'day_of_month':[2,2,5,4,6,8,10,15,25],
    'amount':[1000,1000,50,1500,3000,1500,4000,2000,2000]}
dd = pd.DataFrame(d)
print(dd)
    id  day_of_month    amount
0   1     2            1000
1   1     2            1000
2   1     5             50
3   3     4            1500
4   3     6            3000
5   3     8            1500
6   5     10           4000
7   5     15           2000
8   5     25           2000

然后我这样做:

dd[dd.duplicated(subset = ['id','amount'], keep = False)]
    id  day_of_month       amount
0   1      2                1000
1   1      2                1000
3   3      4                1500
5   3      8                1500
7   5      15               2000
8   5      25               2000

如您所见,输出的最后一行是误报,因为我没有设法实现当月的 +-5 天窗口。 我想要的输出应该是这个

   id       day_of_month    amount
0   1      2                1000
1   1      2                1000
3   3      4                1500
5   3      8                1500

关于如何实现我需要的任何想法?谢谢!

【问题讨论】:

    标签: python python-3.x pandas dataframe duplicates


    【解决方案1】:

    为什么不添加另一个mask

    你原来的mask

    non_duplicates_mask = dd.duplicated(subset = ['id','amount'], keep = False)
    

    月月mask:

    months_mask = abs(dd['day_of_month'] - dd['day_of_month'].shift()) >= 5
    

    我使用abs 以防day_of_month 并不总是按升序排列,

    然后使用两个掩码应用xor 操作:

    dd[non_duplicates_mask ^ months_mask]
    

    输出:

        id  day_of_month    amount
    0   1   2               1000
    1   1   2               1000
    3   3   4               1500
    5   3   8               1500
    

    编辑: xor (eXclusive OR) 的操作如下:

    【讨论】:

    • 感谢您的回答。我以前从未使用过异或操作。它到底在做什么?
    • @Unicorn07 我已经添加了xor 的可视化表示,并且如果答案确实解决了您的问题,不要忘记投票并勾选绿色 v :)
    猜你喜欢
    • 2017-03-22
    • 2021-12-08
    • 2013-07-20
    • 2017-02-23
    • 2021-11-29
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多