2016-08-08 20 views
1

Ich habe die folgenden zwei Datenrahmen in Pandas:Wie ein Datenrahmen in Pandas Python aktualisieren

DF1: 
AuthorID1 AuthorID2 Co-Authored 
A1   A2   0 
A1   A3   0 
A1   A4   0 
A2   A3   0 

DF2: 
AuthorID1 AuthorID2 Co-Authored 
A1   A2   5 
A2   A3   6 
A6   A7   9 

Ich möchte (ohne Looping und zu vergleichen), um die passenden AuthorID1 und AuthorID2 Paarung in DF2 zu finden, die in DF1 existieren und aktualisiere die Spaltenwerte entsprechend. Also wäre das Ergebnis für die obigen zwei Tabellen das folgende:

Resulting Updated DF1: 
AuthorID1 AuthorID2 Co-Authored 
A1   A2   5 
A1   A3   0 
A1   A4   0 
A2   A3   6 

Gibt es einen schnellen Weg, dies zu tun? Da ich 7 Millionen Zeilen in DF1 habe und Schleifen und Vergleiche nur ewig dauern würden.

Update: beachten Sie, dass die letzten beiden in DF2 nicht Teil des Updates in DF1 sein sollte, da es nicht in DF1

Antwort

1

existiert können Sie verwenden update:

df1.update(df2) 
print (df1) 
    AuthorID1 AuthorID2 Co-Authored 
0  A1  A2   5.0 
1  A2  A3   6.0 
2  A1  A4   0.0 
3  A2  A3   0.0 

Probe:

df1 = pd.DataFrame({'new': {0: 7, 1: 8, 2: 1, 3: 3}, 
        'AuthorID2': {0: 'A2', 1: 'A3', 2: 'A4', 3: 'A3'}, 
        'AuthorID1': {0: 'A1', 1: 'A1', 2: 'A1', 3: 'A2'}, 
        'Co-Authored': {0: 0, 1: 0, 2: 0, 3: 0}}) 

df2 = pd.DataFrame({'AuthorID2': {0: 'A2', 1: 'A3'}, 
        'AuthorID1': {0: 'A1', 1: 'A2'}, 
        'Co-Authored': {0: 5, 1: 6}}) 

    AuthorID1 AuthorID2 Co-Authored new 
0  A1  A2   0 7 
1  A1  A3   0 8 
2  A1  A4   0 1 
3  A2  A3   0 3 

print (df2) 
    AuthorID1 AuthorID2 Co-Authored 
0  A1  A2   5 
1  A2  A3   6 

df1.update(df2) 
print (df1) 
    AuthorID1 AuthorID2 Co-Authored new 
0  A1  A2   5.0 7 
1  A2  A3   6.0 8 
2  A1  A4   0.0 1 
3  A2  A3   0.0 3 

EDIT von Kommentar:

ich glaube, Siefiltern müssenvon df1 zunächst mit isin:

df2 = df2[df2[['AuthorID1','AuthorID2']].isin(df1[['AuthorID1','AuthorID2']]).any(1)] 
print (df2) 
    AuthorID1 AuthorID2 Co-Authored 
0  A1  A2   5 
1  A2  A3   6 

df1.update(df2) 
print (df1) 
    AuthorID1 AuthorID2 Co-Authored 
0  A1  A2   5.0 
1  A2  A3   6.0 
2  A1  A4   0.0 
3  A2  A3   0.0 
+0

würde dies immer noch funktionieren, wenn ich mehr Spalten in DF1 habe, aber nur die Spalte "Co-Authored" in DF1 auf der Grundlage der aktualisierten Werte in DF2 aktualisieren möchte? – BKS

+0

Für mich funktioniert es mit dem Hinzufügen neuer Spalte zu 'DF1', gib mir eine Zeit, ich füge Probe hinzu. – jezrael

+0

Ich habe ein anderes Problem. Was ist, wenn DF2 Werte für AuthorID1 und AuthorID2 enthält, die nicht in DF1 enthalten sind? In diesem Fall sollte es ignoriert werden und nicht auf DF1 aktualisiert werden. Wie lege ich die Kriterien für die Aktualisierung fest? Ich werde die Frage entsprechend bearbeiten, es scheint "Update" funktioniert in diesem Fall nicht – BKS

0

Sie die Parameter wie unten verwenden:

filter_func : callable(1d-array) -> 1d-array<boolean>, default None 

können wählen, andere Werte als NA zu ersetzen. Rückgabe True für Werte, die aktualisiert werden sollten