我坚持了一段时间。我想从受益人和付款人相同且金额相等的表中过滤出每月定期付款。我正在过滤工资。
Date Beneficient Payer Amount
2014-09-10 X A 3000
2014-09-15 X A 4000
2014-10-10 X A 3000
2014-10-11 X A 5500
2014-11-10 X A 3000
2014-09-11 Y B 7000
2014-09-14 Y B 8500
2014-10-11 Y B 7000
2014-10-16 Y B 8900
2014-11-11 Y B 7000
2014-11-17 Y B 8200
理想的结果:
Date Beneficient Payer Amount
2014-09-10 X A 3000
2014-10-10 X A 3000
2014-11-10 X A 3000
2014-09-11 Y B 7000
2014-10-11 Y B 7000
2014-11-11 Y B 7000
通过指定检查重复的列来使用duplicated
,keep=False
用于返回布尔掩码的所有重复行并按boolean indexing
过滤:
df = df[df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False)]
print (df)
Date Beneficient Payer Amount
0 2014-09-10 X A 3000
2 2014-10-10 X A 3000
4 2014-11-10 X A 3000
5 2014-09-11 Y B 7000
7 2014-10-11 Y B 7000
9 2014-11-11 Y B 7000
细节:
print (df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False))
0 True
1 False
2 True
3 False
4 True
5 True
6 False
7 True
8 False
9 True
10 False
dtype: bool
更通用的解决方案:
想法是获取日期时间之间的差异,首先NaN
替换为30
并进行比较。
这里有一个小问题 - 月份之间的天数不同,最糟糕的是February
- 可能的差异小于30
,31
.
所以在我看来,总是有差异的一般解决方案总是+-1 days
并不容易。
df = df[df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False)]
df = df.sort_values(['Beneficient','Payer','Amount','Date'])
cols = [df['Beneficient'], df['Payer'], df['Amount']]
df = df[df['Date'].groupby(cols).diff().dt.days.fillna(30).isin([30,31])]
print (df)
Date Beneficient Payer Amount
0 2014-09-10 X A 3000
2 2014-10-10 X A 3000
4 2014-11-10 X A 3000
5 2014-09-11 Y B 7000
7 2014-10-11 Y B 7000
9 2014-11-11 Y B 7000
要将这些结果过滤到它们自己的数据帧中,同时保留原始记录,您需要使用 duplicated():
sub_df = df[df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False)]