【问题标题】:Find Duplicates on Multiple Criteria查找多个条件的重复项
【发布时间】:2019-03-17 11:15:21
【问题描述】:

我有一组具有日期、金额、说明和来源的金融交易,我想要查找金额相同,日期在一天内,但来源不同的交易。来源应该不同,因为交易是从许多来源导入的,并且每个来源都有唯一的条目。

例如,我想发现第 1 行和第 3 行是重复的:

'date','amount','description','source'
1/5/2018, 5.28, 'McDonalds', 'BankOfAmerica'
1/6/2018, 8.44, 'Starbucks', 'BankOfAmerica'
1/5/2018, 5.28, 'McDonalds Rest', 'BoA'
2/10/2018, 22.72, 'Chipolte', 'Chase'
3/10/2018, 4.58, 'Wendys', 'BoA'

我在 Python 中尝试过,我可以找到重复项:

df_no_dups = df.drop_duplicates(subset=['amount','dates'])
df_dups = df[~df.isin(df_no_dups)].dropna()

但这是一个精确的日期匹配,然后我必须运行另一个脚本以确保来源不同。

我还尝试groupby数量,然后在其中迭代以查找日期接近且来源不同的位置,但我无法弄清楚组的详细信息。

其他方法可能是使用 SQL 或在交易所在的电子表格 (google) 中。

【问题讨论】:

  • 你能做一个reproducible 的例子吗,所以我们可以复制这个问题。谢谢
  • @anky_91 有帮助吗?
  • 是的,谢谢,这里的来源栏是第3还是第4?
  • @anky_91 -- 第四 -- 我会添加标题

标签: python sql pandas google-sheets


【解决方案1】:

考虑以下数据(在第 3 行添加一行以便更好地理解)

data = pd.compat.StringIO("""5 Jan, 5.28, 'McDonalds', 'BankOfAmerica'
6 Jan, 8.44, 'Starbucks', 'BankOfAmerica'
5 Jan, 5.28, 'McDonalds Rest', 'BoA'
5 Jan, 5.28, 'McDonalds Rest', 'BankOfAmerica'
10 Feb, 22.72, 'Chipolte', 'Chase'""")
df = pd.read_csv(data,header=None)
df.columns=['Date','Amount','Dscription','Source']
print(df)

 Date  Amount         Dscription            Source
0   5 Jan    5.28        'McDonalds'   'BankOfAmerica'
1   6 Jan    8.44        'Starbucks'   'BankOfAmerica'
2   5 Jan    5.28   'McDonalds Rest'             'BoA'
3   5 Jan    5.28   'McDonalds Rest'   'BankOfAmerica'
4  10 Feb   22.72         'Chipolte'           'Chase'

对于重复和不同的来源:

df_dups =df[df.duplicated(['Date','Amount'],keep=False)]
df_dups =df_dups.drop_duplicates(['Date','Amount','Source'],keep=False)
print(df_dups)


    Date  Amount         Dscription            Source
0  5 Jan    5.28        'McDonalds'   'BankOfAmerica'
2  5 Jan    5.28   'McDonalds Rest'             'BoA'

为了不重复(基本上拉所有其他行df-df_dup):

no_dups=df.loc[~df.index.isin(df_dups.index)]
print(no_dups)

     Date    Amount      Dscription            Source
1   6 Jan    8.44        'Starbucks'   'BankOfAmerica'
3   5 Jan    5.28   'McDonalds Rest'   'BankOfAmerica'
4  10 Feb   22.72         'Chipolte'           'Chase'

【讨论】:

  • 知道日期是否相差一天?
  • 我的意思是,如果日期是 1 月 5 日和 1 月 6 日,但来源不同且金额相同,那么它仍然是重复的,因为财务记录有时会相差一天。
  • 等等!这不起作用。第二步只是删除所有具有重复来源的人。
  • @bonhoffer 我的错,在删除 dups 时错过了插入日期:使用df_dups =df_dups.drop_duplicates(['Date','Source']) 编辑了答案
  • 因此该方法将删除大量重复项,因为它们共享一个共同的来源。
【解决方案2】:

使用存在

select t1.* from table_name t1
where exists( select 1 from table_name t2 
             where t2.date=t1.date and t2.amount=t1.amount and t1.source<>t2.source)

【讨论】:

  • 哇 -- 这是相当困难的 -- 谢谢 -- 我可以先使用 datediff 函数或其他东西 = 如果我希望日期相差一天
猜你喜欢
  • 1970-01-01
  • 2020-07-01
  • 2018-03-11
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多