熊猫:过滤定期付款



我坚持了一段时间。我想从受益人和付款人相同且金额相等的表中过滤出每月定期付款。我正在过滤工资。

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

通过指定检查重复的列来使用duplicatedkeep=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- 可能的差异小于3031.

所以在我看来,总是有差异的一般解决方案总是+-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)]

最新更新