Betrachten Sie den Datenrahmen df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
Wenn ich mitschalte axis=0(Standardeinstellung)
df.shift()
A B
0 NaN NaN
1 1.0 X
Es schiebt alle Zeilen wie erwartet um eine Zeile nach unten.
Aber wenn ich mich bewege axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Alles ist null, als ich erwartet hatte
A B
0 NaN 1
1 NaN 2
Ich verstehe, warum das passiert ist. Denn axis=0Pandas arbeitet spaltenweise, wobei jede Spalte eine einzelne ist, dtypeund beim Verschieben gibt es ein klares Protokoll, wie mit dem eingeführten NaNWert am Anfang oder Ende umgegangen werden soll. Beim Verschieben führen axis=1wir jedoch eine potenzielle Mehrdeutigkeit dtypevon einer Spalte zur nächsten ein. In diesem Fall versuche ich, int64eine objectSpalte zu erzwingen, und Pandas beschließt, die Werte einfach auf Null zu setzen.
Dies wird problematischer, wenn die dtypessind int64undfloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
Und das gleiche passiert
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Meine Frage
Was sind gute Optionen zum Erstellen eines Datenrahmens, der verschoben wird und axis=1in dem das Ergebnis Werte und d-Typen verschoben hat?
Für den Fall int64/ float64würde das Ergebnis folgendermaßen aussehen:
df_shifted
A B
0 NaN 1
1 NaN 2
und
df_shifted.dtypes
A object
B int64
dtype: object
Ein umfassenderes Beispiel
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.], C=['X', 'Y'], D=[4., 5.], E=[4, 5]))
df
A B C D E
0 1 1.0 X 4.0 4
1 2 2.0 Y 5.0 5
Sollte so aussehen
df_shifted
A B C D E
0 NaN 1 1.0 X 4.0
1 NaN 2 2.0 Y 5.0
df_shifted.dtypes
A object
B int64
C float64
D object
E float64
dtype: object
object
blocks>. <Verwenden Sie diese stattdessen und sehen Siedf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object?