Python Pandas Fuzzy Merge / Match mit Duplikaten

Ich habe derzeit 2 Datenrahmen, einen für Spender und einen für Spendenaktionen. Im Idealfall versuche ich herauszufinden, ob auch Spender Spenden geleistet haben, und wenn ja, kopieren Sie einige dieser Informationen in meinen Spendendatensatz (Name des Spenders, E-Mail-Adresse und erste Spende). Probleme mit meinen Daten sind 1) Ich muss nach Name und E-Mail-Adresse übereinstimmen, aber ein Benutzer kann leicht unterschiedliche Namen haben (von Kat und Kathy). 2) Doppelte Namen für Spender und Spendenaktionen. 2a) Mit Spendern kann ich eindeutige Namen / E-Mail-Kombinationen erhalten, da mir nur das Datum der ersten Spende am Herzen liegt 2b) Mit Spendenaktionen muss ich jedoch beide Zeilen behalten und keine Daten wie das Datum verlieren.

Beispielcode, den ich gerade habe:

import pandas as pd
import datetime
from fuzzywuzzy import fuzz
import difflib 

donors = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Tom Smith","Jane Doe","Jane Doe","Kat test"]), "Email": pd.Series(['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]','[email protected]']),"Date": (["27/03/2013  10:00:00 AM","1/03/2013  10:39:00 AM","2/03/2013  10:39:00 AM","3/03/2013  10:39:00 AM","4/03/2013  10:39:00 AM","27/03/2013  10:39:00 AM"])})
fundraisers = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Kathy test","Tes Ester", "Jane Doe"]),"Email": pd.Series(['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]']),"Date": pd.Series(["2/03/2013  10:39:00 AM","27/03/2013  11:39:00 AM","3/03/2013  10:39:00 AM","4/03/2013  10:40:00 AM","27/03/2013  10:39:00 AM"])})
donors["Date"] = pd.to_datetime(donors["Date"], dayfirst=True)
fundraisers["Date"] = pd.to_datetime(donors["Date"], dayfirst=True)
donors["code"] = donors.apply(lambda row: str(row['name'])+' '+str(row['Email']), axis=1)
idx = donors.groupby('code')["Date"].transform(min) == donors['Date']
donors = donors[idx].reset_index().drop('index',1)

So bleibt mir die erste Spende jedes Spenders (vorausgesetzt, jeder mit genau demselben Namen und derselben E-Mail-Adresse ist dieselbe Person).

Im Idealfall möchte ich, dass mein Fundraiser-Datensatz wie folgt aussieht:

Date                Email       name        Donor Name  Donor Email Donor Date
2013-03-27 10:00:00     [email protected]      John Doe    John Doe    [email protected]      2013-03-27 10:00:00 
2013-01-03 10:39:00     [email protected]      John Doe    John Doe    [email protected]      2013-03-27 10:00:00 
2013-02-03 10:39:00     [email protected]      Kathy test  Kat test    [email protected]      2013-03-27 10:39:00 
2013-03-03 10:39:00     [email protected]    Tes Ester   
2013-04-03 10:39:00     [email protected]  Jane Doe    Jane Doe    [email protected]  2013-04-03 10:39:00

Ich habe versucht, diesem Thread zu folgen:ist es möglich, Fuzzy Match Merge mit Python Pandas zu machen? Aber halten Sie Index außerhalb des Bereichs Fehler (schätze, es mag nicht die doppelten Namen in Spendenaktionen) :( Also irgendwelche Ideen, wie ich diese Datensätze abgleichen / zusammenführen kann?

Mach es mit for-Schleifen (was funktioniert, aber super langsam ist und ich denke, es muss einen besseren Weg geben)

fundraisers["donor name"] = ""
fundraisers["donor email"] = ""
fundraisers["donor date"] = ""
for donindex in range(len(donors.index)):
    max = 75
    for funindex in range(len(fundraisers.index)):
        aname = donors["name"][donindex]
        comp = fundraisers["name"][funindex]
        ratio = fuzz.ratio(aname, comp)
        if ratio > max:
            if (donors["Email"][donindex] == fundraisers["Email"][funindex]):
                ratio *= 2
            max = ratio
            fundraisers["donor name"][funindex] = aname
            fundraisers["donor email"][funindex] = donors["Email"][donindex]
            fundraisers["donor date"][funindex] = donors["Date"][donindex]

Antworten auf die Frage(2)

Ihre Antwort auf die Frage