2017-04-03 8 views
4

Ich habe einen Datenrahmen wiewie SQL coalesce in Pandas

df = pd.DataFrame({"A":[1,2,np.nan],"B":[np.nan,10,np.nan], "C":[5,10,7]}) 
    A  B C 
0 1.0 NaN 5 
1 2.0 10.0 10 
2 NaN NaN 7 

Ich möchte hinzufügen, um eine neue Spalte ‚D‘ implementieren. Erwartete Ausgabe ist

 A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

Vielen Dank im Voraus!

+0

Der Wert von 'df' in Ihrem ersten Code-Snippet ist falsch. Und wie berechnet man die erwartete Leistung? – DyZ

Antwort

4

Ich glaube, Sie brauchen bfill mit der Auswahl ersten Spalte iloc:

df['D'] = df.bfill(axis=1).iloc[:,0] 
print (df) 
    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

gleiche wie:

df['D'] = df.fillna(method='bfill',axis=1).iloc[:,0] 
print (df) 
    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 
3

Option 1
pandas

df.assign(D=df.lookup(df.index, df.isnull().idxmin(1))) 

    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

Option 2
numpy

v = df.values 
j = np.isnan(v).argmin(1) 
df.assign(D=v[np.arange(len(v)), j]) 

    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

naive Zeittest
über gegebene Daten

enter image description here

über größere Daten

enter image description here

+0

@jezrael Post aktualisiert – piRSquared

+0

Wenn ich nur 'A' und 'C' für die Erstellung von 'D' will, wo kann ich es angeben. Bitte lassen Sie es mich wissen – Anoop

+0

@Annoop Sie können diese Ansätze auf 'df [['A', 'C']]' 'ausführen. Dies funktioniert besonders gut für den "numpigen" Ansatz. 'v = df [['A', 'C']]. Werte ' – piRSquared

1

Ein anderer Weg ist explizit in dieser Reihenfolge Spalte D mit A, B, C zu füllen.

df['D'] = np.nan 
df['D'] = df.D.fillna(df.A).fillna(df.B).fillna(df.C)