2017-11-22 8 views
1

Alle,Coalesce (SQL) Funktionalität für Python Pandas

konnte ich eine Funktion namens "combine_first()" in der pandas documentation sowie stackoverflow finden. Das funktioniert nur für ein paar logische Beispiele. Ich war in der Lage zu erreichen, dass unten die Funktion "combine_first()" mehrfach kombiniert wurde (in diesem Fall 6). Kann jemand helfen, eine elegantere Lösung zu finden?

Das Ergebnis der erstellten Variablen "category_id" sollte den ersten nicht fehlenden Wert enthalten, der mit der letzten Variablen (category_id7) beginnt und auf den ersten aufsteigend ist. Wenn category_id (x) aufgefüllt ist, sollte category_id diesen Wert annehmen und die Verarbeitung für jede Zeile im Datenframe stoppen.

d={'category_id1':[32991,32991,32991,32991,32991], 
    'category_id2':[22,22,22,22,22], 
    'category_id3':[33058,51,121,120,32438], 
    'category_id4':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id5':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id6':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id7':[np.nan,np.nan,np.nan,np.nan,np.nan] 
    } 
df=pd.DataFrame(data=d) 
df['category_id']=df.category_id7.combine_first(df.category_id6).combine_first(df.category_id5).combine_first(df.category_id4).combine_first(df.category_id3).combine_first(df.category_id2).combine_first(df.category_id1) 
print(df) 

Antwort

1

Sie versuchen, von hinten zu kaskadieren. Also kehre ich die Reihenfolge der Spalten mit iloc um. Ich folge das mit pd.DataFrame.notnull(), um zu identifizieren, welche Zellen nicht null sind. Wenn ich anschließend pd.DataFrame.idxmax ausführen, finde ich alle Spaltennamen für den ersten Nicht-Null-Wert in jeder Zeile, beginnend von der Rückseite. Schließlich verwende ich pd.DataFrame.lookup, um die Werte zu finden, die den gefundenen Spalten zugeordnet sind.

df.assign(
    category_id=df.iloc[:, ::-1].notnull().idxmax(1).pipe(
     lambda d: df.lookup(d.index, d.values) 
    ) 
) 

    category_id1 category_id2 category_id3 category_id4 category_id5 category_id6 category_id7 category_id 
0   32991   22   33058   NaN   NaN   NaN   NaN  33058 
1   32991   22   51   NaN   NaN   NaN   NaN   51 
2   32991   22   121   NaN   NaN   NaN   NaN   121 
3   32991   22   120   NaN   NaN   NaN   NaN   120 
4   32991   22   32438   NaN   NaN   NaN   NaN  32438 
+0

Ich verstehe nicht die ganze Funktionalität, aber es funktioniert einwandfrei. Sehr geschätzt! – Kyle