Sie in e laufen konnte Rrors, wenn Ihre Nicht-Index-Spalte Zellen mit NaN hat.
print df1
Team Year foo
0 Hawks 2001 5
1 Hawks 2004 4
2 Nets 1987 3
3 Nets 1988 6
4 Nets 2001 8
5 Nets 2000 10
6 Heat 2004 6
7 Pacers 2003 12
8 Problem 2112 NaN
print df2
Team Year foo
0 Pacers 2003 12
1 Heat 2004 6
2 Nets 1988 6
3 Problem 2112 NaN
new = df1.merge(df2,on=['Team','Year'],how='left')
print new[new.foo_y.isnull()]
Team Year foo_x foo_y
0 Hawks 2001 5 NaN
1 Hawks 2004 4 NaN
2 Nets 1987 3 NaN
4 Nets 2001 8 NaN
5 Nets 2000 10 NaN
6 Problem 2112 NaN NaN
Das Problem Team in 2112 hat keinen Wert für foo in beiden Tabellen. Der linke Join hier wird die Zeile, die in beiden Datenrahmen übereinstimmt, fälschlicherweise als nicht im rechten Datenrahmen vorhanden zurückgeben.
Lösung:
Was ich tue, ist eine einzigartige Spalte auf den inneren Datenrahmen hinzufügen und einen Wert für alle Zeilen eingestellt. Wenn Sie dann beitreten, können Sie überprüfen, ob diese Spalte NaN ist, damit die innere Tabelle eindeutige Datensätze in der äußeren Tabelle findet.
df2['in_df2']='yes'
print df2
Team Year foo in_df2
0 Pacers 2003 12 yes
1 Heat 2004 6 yes
2 Nets 1988 6 yes
3 Problem 2112 NaN yes
new = df1.merge(df2,on=['Team','Year'],how='left')
print new[new.in_df2.isnull()]
Team Year foo_x foo_y in_df1 in_df2
0 Hawks 2001 5 NaN yes NaN
1 Hawks 2004 4 NaN yes NaN
2 Nets 1987 3 NaN yes NaN
4 Nets 2001 8 NaN yes NaN
5 Nets 2000 10 NaN yes NaN
NB. Die Problemzeile wird jetzt korrekt herausgefiltert, da sie einen Wert für in_df2 enthält. Nach
Problem 2112 NaN NaN yes yes
how = 'links'? sicherlich ist das nicht, was Sie wollen (angesichts Ihrer SO-Note muss es komplexer sein) –
Links oder rechts merge gibt mir einen Datenrahmen, der Zeilen enthält, die in einem der Datenrahmen vorhanden sind. Aber ich brauche einen Datenrahmen, der Zeilen enthält, die in einem Datenrahmen und NICHT in einem anderen vorhanden sind. – Roman
Wenn es nur eine Zusammenführungsschlüssel ist, dann könntest du es mit 'isin' und' ~ ' –