我被这个问题困扰了一段时间。我想从表中筛选出定期每月付款,其中福利和支付者是相同的,金额是相等的。我在过滤掉薪水。
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发布于 2018-01-16 22:27:03
通过为check dupes指定列来使用duplicated,为布尔掩码和filter by boolean indexing指定返回所有重复行的keep=False
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更通用的解决方案:
想法是获取datetimes之间的差异,首先用30和NaN替换datetimes。
这里有一个小问题-不同月份的天数不同,最糟糕的是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发布于 2018-01-16 22:30:19
要将这些结果过滤到它们自己的数据帧中,同时保留原始记录,您需要使用duplicated()
sub_df = df[df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False)]https://stackoverflow.com/questions/48283245
复制相似问题