Considera il frame di dati df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
Se passo avanti axis=0(impostazione predefinita)
df.shift()
A B
0 NaN NaN
1 1.0 X
Spinge tutte le file verso il basso di una riga come previsto.
Ma quando passo avanti axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Tutto è nullo quando mi aspettavo
A B
0 NaN 1
1 NaN 2
Capisco perché è successo. Infatti axis=0, Pandas opera colonna per colonna dove ogni colonna è una singola dtypee quando si sposta, esiste un protocollo chiaro su come gestire il NaNvalore introdotto all'inizio o alla fine. Ma quando ci spostiamo axis=1introduciamo una potenziale ambiguità dtypeda una colonna all'altra. In questo caso, sto cercando di forzare int64una objectcolonna e Panda decide di annullare i valori.
Questo diventa più problematico quando lo dtypessono int64efloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
E succede la stessa cosa
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
La mia domanda
Quali sono le buone opzioni per la creazione di un frame di dati che viene spostato lungo il axis=1quale il risultato ha spostato valori e tipi?
Per il caso int64/ float64il risultato sarebbe simile a:
df_shifted
A B
0 NaN 1
1 NaN 2
e
df_shifted.dtypes
A object
B int64
dtype: object
Un esempio più completo
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
Dovrebbe apparire così
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>. <Usa questo invece e vedidf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object?