2017-06-01 4 views
1

Ich habe zwei Datenrahmen mit identischen Spalten. Die zweite Spalte ist eine Teilmenge der Indexwerte der ersten Spalte, enthält jedoch für einige Spalten leere Felder und für andere aktualisierte Informationen.Überprüfen eines Pandas Dataframe für Elemente zum Aktualisieren eines anderen

Beispiel:

DFA:

  Height Weight Age Street PhoneNumber 

Pete  5.2  130  33 Pine 123-456-7890 
Mary  5.0  110  34 Main 434-444-5555 
Rob  6.0  230  44 Maple 999-444-2222 
.... 

dfb:

 Height Weight Age Street PhoneNumber 

Pete  Nan  125  Nan Arbor  Nan 
Rob  Nan  235  45  Nan 776-333-3222 

ich die Felder in dfa mit den neuen Informationen in dfb aktualisieren möchten. Wenn es keine Aktualisierung von dfb gibt (das Feld ist Nan), möchte ich den ursprünglichen Wert in dfa beibehalten.

Die einzige Möglichkeit, die ich denken kann, dies zu tun ist durch Zeile und Spalte finden Sie die Elemente in dfb und legen Sie die entsprechende Adresse in dfa gleich der Adresse in dfb iterieren. Hässlich.

Gibt es eine sauberere (und mehr Python) Möglichkeit, dies zu tun?

Vielen Dank im Voraus.

EDIT: Geänderte dfb für Klarheit. Die zwei dfs haben keine identischen Indizes. dfb ist eine Teilmenge von dfa.

Antwort

5

Was Sie brauchen, ist combine_first sicherstellen, dass diejenigen, "Nan" sind np.nan wirklich zuerst:

dfb = dfb.replace('Nan',np.nan) 
dfb.combine_first(dfa) 

Ausgang:

 Height Weight Age Street PhoneNumber 
Pete  5.2 125 33 Arbor 123-456-7890 
Mary  5.0 110 34 Main 434-444-5555 
Rob  6.0 235 45 Maple 776-333-3222 
+0

Interessant. In der Dokumentation wird angegeben, dass die Werte von a mit b priorisiert werden, um Löcher zu füllen. Ich habe noch nicht getestet, aber es scheint, wenn ich richtig verstehe, dass die Werte von a verwendet werden (auch wenn null), aber ersetzt werden, wenn es einen Nicht-Null-Wert von b gibt, wobei index.a = = index.b. ist das richtig? – Windstorm1981

+0

Der Ausgang stammt von 'dfb'. Sie müssen dann entweder "dfa" neu zuweisen oder dann "dfb" als den fertigen Datenrahmen verwenden. Ich glaube, 'update' ist eine sauberere Lösung. – Alexander

+0

Nur sauberer, wenn Sie Ihre Änderungsverfolgung in Ihrem ursprünglichen Datenrahmen verlieren möchten. Ich denke, es ist sicherer, wenn Sie dem Benutzer die Möglichkeit geben, ein neues dfc neu zuzuordnen oder zu erstellen, daher können sie bei Bedarf zum ursprünglichen Datenrahmen zurückkehren. –

1

Wenn der Index von dfb die gleiche wie DFA ist, vielleicht mit etwas Maske, so etwas wie

mask = dfb.notnull() 
dfa[mask] = dfb[mask] 
+0

Leider sind die Indizes nicht identisch. dfb.index ist eine Untermenge von dfa.index – Windstorm1981

+0

anscheinend (ich machte eine Überprüfung) es funktioniert auch wenn dfb Index und Spalten sind eine Untermenge von dfa, trotzdem fand ich die anderen Lösungen mehr richtige –

+0

Danke. Ich bin mit Masken völlig unbekannt. Ich muss nachlesen, um herauszufinden, wie ich mich bewerben kann. Ist das Konzept mit einer Maske dazu da, Werte in einem Objekt zu "gruppieren", so dass sie auf ein zweites identisches (oder fast identisches) Objekt angewendet werden können? – Windstorm1981

1

Was Sie suchen fillna() ist, nehmen al ook hier link

in Ihrem Fall nur dfb.fillna(dfa) sollte

+0

Das ist cool. Ich war mir nicht bewusst, dass Sie fillna() auf einer Datenrahmenebene wie dieser verwenden können. Aber bitte sehe meine Bearbeitung. dfb ist eigentlich eine Teilmenge von dfa-Beobachtungen. Wenn ich 'dfb.fillna (dfa)' hätte, würde ich alle Zeilen in 'dfa' verlieren, die nicht in' dfb' sind. Gibt es eine Wendung in Ihrem Vorschlag, die funktionieren könnte? – Windstorm1981

+0

Es funktioniert das gleiche, zumindest in dem Test, den ich gemacht habe, sonst sieht der combine_first() sehr ansprechend aus – gionni

+0

'fillna' aktualisiert nur die NaN-Werte in' dfa' mit den Werten aus 'dfb'. Das OP hat angefordert, dass alle Nicht-Null-Werte von "dfb" verwendet werden, um "dfa" zu aktualisieren. – Alexander

1

Sie wollen einfach tun arbeiten, um Ihre ursprünglichen Datenrahmen update:

dfa.update(dfb) 

>>> dfa 

     Height Weight Age Street PhoneNumber 
Pete 5.2  125  33 Arbor 123-456-7890 
Mary 5.0  110  34 Main 434-444-5555 
Rob  6.0  235  45 Maple 776-333-3222 

update die ursprüngliche Datenrahmen an Ort und Stelle ändert nicht-NA mit Werten aus dem zweiter Datenrahmen.

Verwandte Themen