Ich habe einen DataFrame, wo mehrere Zeilen jeden Index überspannen. Unter dem ersten Index zum Beispiel hat ein solche Struktur:Pandas zwingen NaN zum Ende jeder Spalte bei jedem Index
df = pd.DataFrame([["A", "first", 1.0, 1.0, np.NaN],
[np.NaN, np.NaN, 2.0, np.NaN, 2.0],
[np.NaN, np.NaN, np.NaN, 3.0, 3.0]],
columns=["ID", "Name", "val1", "val2", "val3"],
index=[0, 0, 0])
Out[4]:
ID Name val1 val2 val3
0 A first 1 1 NaN
0 NaN NaN 2 NaN 2
0 NaN NaN NaN 3 3
Ich mag jede Spalte sortieren/bestellen, so dass die NaN
s am unteren Ende jeder Spalte in diesem gegebenen Index ist - ein Ergebnis, das aussieht dies wie:
ID Name val1 val2 val3
0 A first 1 1 2
0 NaN NaN 2 3 3
0 NaN NaN NaN NaN NaN
Ein explizites Beispiel könnte wie folgt aussehen:
df = pd.DataFrame([["A", "first", 1.0, 1.0, np.NaN],
[np.NaN, np.NaN, 2.0, np.NaN, 2.0],
[np.NaN, np.NaN, np.NaN, 3.0, 3.0],
["B", "second", 4.0, 4.0, np.NaN],
[np.NaN, np.NaN, 5.0, np.NaN, 5.0],
[np.NaN, np.NaN, np.NaN, 6.0, 6.0]],
columns=[ "ID", "Name", "val1", "val2", "val3"],
index=[0, 0, 0, 1, 1, 1])
Out[5]:
ID Name val1 val2 val3
0 A first 1 1 NaN
0 NaN NaN 2 NaN 2
0 NaN NaN NaN 3 3
1 B second 4 4 NaN
1 NaN NaN 5 NaN 5
1 NaN NaN NaN 6 6
mit dem gewünschten Ergebnis wie folgt aussehen:
ID Name val1 val2 val3
0 A first 1 1 2
0 NaN NaN 2 3 3
0 NaN NaN NaN NaN NaN
1 B second 4 4 5
1 NaN NaN 5 6 6
1 NaN NaN NaN NaN NaN
Ich habe viele tausend Zeilen in diesem Datenrahmen, wobei jeder Index bis zu ein paar hundert Zeilen enthält. Mein gewünschtes Ergebnis wird sehr hilfreich sein, wenn ich den Datenrahmen to_csv
habe.
Ich habe versucht, sort_values(['val1','val2','val3'])
auf den gesamten Datenrahmen zu verwenden, aber dies führt zu den ungeordneten Indizes. Ich habe versucht, durch jeden Index zu iterieren und an der richtigen Stelle zu sortieren, aber das beschränkt auch nicht den NaN
auf den Boden der Spalte jeder Indizes. Ich habe auch versucht, fillna
zu einem anderen Wert, wie 0, aber ich war auch hier nicht erfolgreich.
Während ich es sicherlich falsch benutze, produziert der na_position
Parameter in sort_values
nicht das gewünschte Ergebnis, obwohl es scheint, dass dies wahrscheinlich was ist.
Edit:
der Index des endgültigen df ist nicht wie in meinem zweiten Beispiel in numerischer Reihenfolge sein, benötigt.
von ignore_index
zu False
in der einzelnen Zeile von @ Leb dritten Codeblock zu ändern,
pd.concat([df[col].sort_values().reset_index(drop=True) for col in df], axis=1, ignore_index=True)
zu
pd.concat([df[col].sort_values().reset_index(drop=True) for col in df], axis=1, ignore_index=False)
und durch eine temporäre df für alle Zeilen in einem bestimmten Index zu erstellen, I war in der Lage, diese Arbeit zu machen - nicht schön, aber es befiehlt Dinge, wie ich sie brauche. Wenn jemand (sicherlich) einen besseren Weg hat, lass es mich wissen.
new_df = df.ix[0]
new_df = pd.concat([new_df[col].sort_values().reset_index(drop=True) for col in new_df], axis=1, ignore_index=False)
max_index = df.index[-1]
for i in range(1, max_index + 1):
tmp = df.ix[i]
tmp = pd.concat([tmp[col].sort_values().reset_index(drop=True) for col in tmp], axis=1, ignore_index=False)
new_df = pd.concat([new_df,tmp])
In [10]: new_df
Out[10]:
ID Name val1 val2 val3
0 A first 1 1 2
1 NaN NaN 2 3 3
2 NaN NaN NaN NaN NaN
0 B second 4 4 5
1 NaN NaN 5 6 6
2 NaN NaN NaN NaN NaN
Ich lösche meine Antwort, denn es sieht aus wie ein kleines verschrobenes Kind dagegen. :-P – Kartik