2016-10-20 4 views
1

df1Werte ersetzen fehlt, die resultieren aus einer pandas

|Invoice # |Date  |Amount  
|12   |12/15/2015 |$10 
|13   |12/16/2015 |$11 
|14   |12/17/2015 |$12 

DF2

|Invoice # |Date  |Amount 
|12   |1/16/2016 |$10 
|14   |1/17/2016 |$12 

Zusammengeführt = df1.merge (DF2, wie = links, on = Rechnung #)

|Invoice # |Date   |Amount 
|12   |12/15/2015 |$10 
|NaN  |NaN   |NaN 
|14   |1/17/2016 |$12 
fusionieren

Was ich tun möchte, ist Rechnung 13, die einen NaN-Wert in der Zusammenführung zurückgegeben und in einer Liste platziert. Irgendwelche Ideen?

+0

Kannst du klarstellen - meinst du, du machst die Zusammenführung auf diese Weise unabhängig oder willst du nur eine Liste von Rechnungen, die nicht zwischen df1 und df2 geteilt werden? – szeitlin

+1

Ich möchte nur eine Liste von Rechnungen, die in DF1 aber nicht DF2 sind. Vielen Dank! – sschade

Antwort

1

Ihr zusammengeführtes Ergebnis zeigt nicht an, was tatsächlich mit einer linken Zusammenführung geschieht?

Hier ist, was ich bekomme, wenn ich versuche, zu reproduzieren, was ich denke, Sie versuchen zu tun (Pandas Version 0.19.0 Ich verwende):

merged = df1.merge(df2, how='left', on='Invoice #') 

merged

Dann können Sie maskieren durch die fehlenden Werte und einen Datenrahmen die Zeilen enthalten:

merged[merged['Amount_y'].isnull()] 

masked

Oder nur eine Spalte mit dem boolean-Flag erstellen:

merged['missing_from_df2'] = merged['Amount_y'].isnull() 

Um die Dinge aus dem maskierten Datenrahmen zu wählen, sie wie jeder anderen Datenrahmen behandeln und Index in eine oder mehr Spalten von ihnen Auflistung (beachten Sie, dass, wenn Sie wollen mehr als einer, müssen Sie doppelte Klammern machen).

select_columns

Sie können es auf eine neue Variable speichern die Syntax einfacher zu machen, wenn Sie mit ihm andere Dinge tun wollen.

masked_selection

+1

Das hat funktioniert. Ich danke dir sehr! – sschade

+0

Gibt es trotzdem ich kann die entsprechende Rechnungsnummer und das Rechnungsdatum zur Rechnung mitnehmen 13 – sschade

+0

Ich meine den Rechnungsbetrag und das Rechnungsdatum. Ich möchte diese Gruppen zusammenhalten. – sschade

0

Methode 1
pd.concat + drop_duplicates

pd.concat([df1, df2]).drop_duplicates(subset=['Invoice #']) 

Methode 2
combine_first

df1.set_index('Invoice #').combine_first(df2.set_index('Invoice #')).reset_index() 

Methode 3
merge

df1.merge(df2, on='Invoice #', suffixes=['', '_'], how='left')[df1.columns] 

Methode 4
join

df1.join(df2.set_index('Invoice #'), on='Invoice #', rsuffix='_')[df1.columns] 

alle produzieren

enter image description here


Timing
pd.concat + drop_duplicates die schnellste ist

enter image description here

Verwandte Themen