首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas:过滤定期付款

Pandas:过滤定期付款
EN

Stack Overflow用户
提问于 2018-01-16 22:13:29
回答 2查看 453关注 0票数 2

我被这个问题困扰了一段时间。我想从表中筛选出定期每月付款,其中福利和支付者是相同的,金额是相等的。我在过滤掉薪水。

代码语言:javascript
复制
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

想要的结果是:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2018-01-16 22:27:03

通过为check dupes指定列来使用duplicated,为布尔掩码和filter by boolean indexing指定返回所有重复行的keep=False

代码语言:javascript
复制
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

详细信息:

代码语言:javascript
复制
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之间的差异,首先用30NaN替换datetimes。

这里有一个小问题-不同月份的天数不同,最糟糕的是February -可能的差异小于3031

因此,在我看来,具有差异的通用解决方案总是+-1 days并非易事。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-01-16 22:30:19

要将这些结果过滤到它们自己的数据帧中,同时保留原始记录,您需要使用duplicated()

代码语言:javascript
复制
sub_df = df[df.duplicated(subset=['Beneficient','Payer','Amount'], keep=False)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48283245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档