Tenez compte de la trame de données df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
   A  B
0  1  X
1  2  Y
Si je me déplace axis=0(par défaut)
df.shift()
     A    B
0  NaN  NaN
1  1.0    X
Il pousse toutes les lignes vers le bas d'une ligne comme prévu.
Mais quand je me déplace axis=1
df.shift(axis=1)
    A    B
0 NaN  NaN
1 NaN  NaN
Tout est nul quand je m'y attendais
     A  B
0  NaN  1
1  NaN  2
Je comprends pourquoi cela s'est produit. Pour axis=0, Pandas fonctionne colonne par colonne où chaque colonne est unique dtypeet lors du déplacement, il existe un protocole clair sur la façon de traiter la NaNvaleur introduite au début ou à la fin. Mais lorsque axis=1nous nous déplaçons, nous introduisons une ambiguïté potentielle d' dtypeune colonne à l'autre. Dans ce cas, j'essaie de forcer int64dans une objectcolonne et Pandas décide de simplement annuler les valeurs.
Cela devient plus problématique lorsque le dtypessont int64etfloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
   A    B
0  1  1.0
1  2  2.0
Et la même chose se produit
df.shift(axis=1)
    A   B
0 NaN NaN
1 NaN NaN
Ma question
Quelles sont les bonnes options pour créer une trame de données qui est décalée le long axis=1de laquelle le résultat a décalé les valeurs et les dtypes?
Pour le cas int64/ float64, le résultat ressemblerait à:
df_shifted
     A  B
0  NaN  1
1  NaN  2
et
df_shifted.dtypes
A    object
B     int64
dtype: object
Un exemple plus complet
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
Devrait ressembler à ceci
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>. <Utilisez-le à la place et voyezdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
                
object?