在 pandas 中查找每月某个时间范围内发生的定期付款
Posted
技术标签:
【中文标题】在 pandas 中查找每月某个时间范围内发生的定期付款【英文标题】:find recurring payments that occur within a time frame monthly in 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
关于如何实现我需要的任何想法?谢谢!
【问题讨论】:
【参考方案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 :) 以上是关于在 pandas 中查找每月某个时间范围内发生的定期付款的主要内容,如果未能解决你的问题,请参考以下文章