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=0
Pandas arbeitet spaltenweise, wobei jede Spalte eine einzelne ist, dtype
und beim Verschieben gibt es ein klares Protokoll, wie mit dem eingeführten NaN
Wert am Anfang oder Ende umgegangen werden soll. Beim Verschieben führen axis=1
wir jedoch eine potenzielle Mehrdeutigkeit dtype
von einer Spalte zur nächsten ein. In diesem Fall versuche ich, int64
eine object
Spalte zu erzwingen, und Pandas beschließt, die Werte einfach auf Null zu setzen.
Dies wird problematischer, wenn die dtypes
sind int64
undfloat64
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=1
in dem das Ergebnis Werte und d-Typen verschoben hat?
Für den Fall int64
/ float64
wü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
?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']))
Antworten:
Es stellt sich heraus, dass Pandas über ähnliche Blöcke wechseln
dtypes
Definieren
df
alsDie Ganzzahlen werden in die nächste Ganzzahlspalte verschoben, die Gleitkommazahlen in die nächste Gleitkommaspalte und die Objekte in die nächste Objektspalte
Ich weiß nicht , ob das eine gute Idee ist, aber das ist , was geschieht.
Nähert sich
astype(object)
zuersttranspose
Wird es schaffen
object
itertuples
Obwohl ich das wahrscheinlich tun würde
quelle
str
Dytpes sind, dann funktioniert es richtig. Wenn Sie dasselbe tun, wenndf = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
es die'XY'
Spalte bis zur'F'
Spalte verschiebt, ist dies definitiv falsch für mich. Meine Pandas-Version ist0.24.2
, es sollte Werbung machendtype
und die Spalten in solchen nicht verschieben ein WegIch habe versucht, eine
numpy
Methode zu verwenden. Die Methode funktioniert so lange, wie Sie Ihre Daten in einem numpy-Array aufbewahren:Wenn Sie den
DataFrame
Konstruktor aufrufen , werden alle Spalten konvertiert,object
obwohl die Werte im Array wie folgt lautenfloat, int, object
:quelle