2016-05-31 17 views
0

Ich habe vor kurzem mit Pandas arbeiten begonnen und ich versuche, einige einfache Reinigung in Daten zu tun. Bisher habe ich gelernt, dass es bei der Verwendung von Pandas viele Einzeiler gibt. So suche ich auch in meinem Fall nach einem. Ich habe DataFrame wie folgt aus:Pandas - ersetzen NaN-Werte mit Werten aus anderen Spalten

C0   C1 C2   C3  C4 
    3789507  2010 NaN  NaN  NaN 
    3789508  NaN NaN  2010  NaN 
    3789509  NaN NaN  2016  NaN 
    3789510  NaN 2014  NaN  NaN 
    3789511  NaN NaN  NaN  2014 

ich mit so etwas landen wollen:

C0   C1 
3789507  2010 
3789508  2010 
3789509  2016 
3789510  2014 
3789511  2014 

Was ich jetzt tue, ist einfach:

k = df.C1.isnull() 
df.C1[k] = df.C2[k] 
k = df.C1.isnull() 
df.C1[k] = df.C3[k] 
k = df.C1.isnull() 
df.C1[k] = df.C4[k] 

Es funktioniert, aber ist nicht die schönste Lösung. Was ist, wenn ich 100 Spalten habe? Ist Schleife hier nur Lösung?

Nur für den Fall meiner for-Schleife sieht wie folgt aus:

for i in range(2,len(df.columns)): 
    k = df.C1.isnull() 
    df.C1[k] = df.ix[:,i] 

Antwort

1

Pandas einige Methoden und forwardfill fehlende Werte verfüllen hat, so können Sie tun:

df['C1'] = df.bfill(axis='columns')['C1'] 

df 
Out[10]: 
     C0  C1  C2  C3  C4 
0 3789507 2010.0  NaN  NaN  NaN 
1 3789508 2010.0  NaN 2010.0  NaN 
2 3789509 2016.0  NaN 2016.0  NaN 
3 3789510 2014.0 2014.0  NaN  NaN 
4 3789511 2014.0  NaN  NaN 2014.0 

Diese für Ihre einfachen Beispiel funktioniert Daten, aber in einem realen Datensatz müssen Sie möglicherweise die Spalten einschränken, die überfüllt werden wie:

fill_cols = ['C1', 'C2', 'C3', 'C4'] 
df['C1'] = df[fill_cols].bfill(axis='columns')['C1'] 
+0

Nur eine Frage - wenn es kein großes Problem ist, kannst du bitte erklären, wie es wirklich funktioniert? Sollte ich es von hinten lesen? Ich meine diesen realen Fall mit ausgewählten Spalten. – sebap123

+1

OK, schauen Sie sich die Zeile an, in der 'C4' einen Wert hat, aber die anderen Spalten fehlen. 'df.bfill (axis = 'columns')' erstellt ein neues Datenframe, wobei jeder fehlende Wert links von 'C4' in dieser Zeile den Wert von' C4' erhält. Der gültige Wert in "C4" wird in alle fehlenden Spalten "gefüllt". Dann kopieren wir einfach die hinterfüllte C1-Spalte in den ursprünglichen Datenrahmen. – Marius

+0

Vielen Dank - jetzt verstehe ich es. – sebap123

Verwandte Themen