データフレームを検討する df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
シフトした場合axis=0(デフォルト)
df.shift()
A B
0 NaN NaN
1 1.0 X
予想どおり、すべての行を1行下に押します。
しかし、私が一緒にシフトすると axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
私が期待したときにすべてがヌルです
A B
0 NaN 1
1 NaN 2
これがなぜ起こったのか理解しています。の場合axis=0、Pandasは列ごとに動作しており、各列は単一でdtypeあり、シフトするときNaNに、最初または最後に導入された値を処理する方法に関する明確なプロトコルがあります。しかし、それに沿っaxis=1てシフトするとdtype、1つの列から次の列へのあいまいさの可能性が生じます。この場合、私は列に力int64を入れようとしてobjectおり、パンダスは単に値をnullにすることにしました。
これdtypesはint64、次の場合にさらに問題になります。float64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
そして同じことが起こります
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
私の質問
結果が値とdtypeをシフトするシフトされたデータフレームを作成するための良いオプションは何axis=1ですか?
int64/ float64ケース結果は次のようになります。
df_shifted
A B
0 NaN 1
1 NaN 2
そして
df_shifted.dtypes
A object
B int64
dtype: object
より包括的な例
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
このようになります
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> <使用代わりにこれと参照してください。df = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
objectか?