2017-01-04 13 views
4

以下は、私が取り組んでいるサンプルデータです。Pythonで特定の条件に一致する重複を見つける

sender receiver date id 
salman akhtar 20161201 1111 
akhtar salman 20161201 1112 
nabeel ahmed 20161201 1113 
salman akhtar 20161201 1114 
salman akhtar 20161202 1115 
nabeel ahmed 20161202 1116 
ahmed nabeel 20161202 1117 
nabeel ahmed 20161202 1118 
nabeel ahmed 20161202 1119 

私が達成しようとしているのは、同じ日付内に同じ送信者と同じ受信者の条件に基づいて重複エントリを見つけることです。

このため、次のコードを記述しました。今

import pandas as pd 
import xlsxwriter 

print 'Script for Finding duplicate entries\n' 

path = raw_input('Enter file name: ') 
print 'Loading file. Please wait...' 

xlsx = pd.ExcelFile(path+'.xlsx') 

print 'File loaded successfully.\n' 
sheet = raw_input('Enter Sheet Name: ') 
df = pd.read_excel(xlsx, sheet) 

df['is_duplicated'] = df.duplicated(['sender', 'receiver','date'],keep=False) 

df_dup = df.loc[df['is_duplicated'] == True] 

print 'Found Below Duplicates' 
print df_dup 

writer = pd.ExcelWriter("pandas_column_formats.xlsx", engine='xlsxwriter') 
df_dup.to_excel(writer, sheet_name='Sheet1') 

writer.save() 

print 'File created successfully.' 

現在のコードのみEXACT重複を返すと私は言った条件に基づいてすべての可能な重複行をしたいので、私もfuzzywuzzyを組み込みたいです。

誰でも助けてください。

答えて

0

このようなものはありますか?

>>> fuzz_ratio = 50 
>>> df_rem = df[~df.duplicated(['sender', 'receiver','date'],keep=False)] 
>>> df_possible_dup = pd.merge(df_rem, df, on='date', suffixes=['', '_j']) 
>>> df_possible_dup.apply(lambda x: fuzz.ratio(x['sender'], x['sender_j']) >= 50 and x['id'] != x['id_j'], axis=1) 

私はあなたの正確な要件を知らないが、おそらくあなたは、送信者または受信者が正確に一致していると、他の部分は可能マッチングであるかどうかを確認したいです。次に、カスタム関数を使用できます。

def worker(x, fuzz_ratio): 
    if x['id'] != x['id_j']: 
     return False 

    if x['sender'] == x['sender_j'] and fuzz.ratio(x['receiver'], x['receiver_j']) > fuzz_ratio: 
     return True 

    if x['receiver'] == x['receiver_j'] and fuzz.ratio(x['sender'], x['sender_j']) > fuzz_ratio: 
     return True 

    return False 

>>> df_possible_dup.apply(lambda x: worker(x, fuzz_ratio)) 
関連する問題