Pertimbangkan kerangka data df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
Jika saya berpindah axis=0(default)
df.shift()
A B
0 NaN NaN
1 1.0 X
Ini mendorong semua baris ke bawah satu baris seperti yang diharapkan.
Tapi saat aku bergeser axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Semuanya nol ketika saya harapkan
A B
0 NaN 1
1 NaN 2
Saya mengerti mengapa ini terjadi. Sebab axis=0, Pandas adalah operasi kolom per kolom di mana setiap kolom adalah tunggal dtypedan ketika bergeser, ada protokol yang jelas tentang bagaimana menangani nilai yang diperkenalkan NaNdi awal atau akhir. Tetapi ketika bergeser, axis=1kami memperkenalkan potensi ambiguitas dtypedari satu kolom ke kolom berikutnya. Dalam hal ini, saya mencoba untuk memaksa int64ke dalam objectkolom dan Pandas memutuskan untuk hanya membatalkan nilai.
Ini menjadi lebih bermasalah ketika dtypesada int64danfloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
Dan hal yang sama terjadi
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Pertanyaan saya
Apa pilihan yang baik untuk membuat kerangka data yang bergeser axis=1di mana hasilnya telah bergeser nilai dan tipe?
Untuk int64/ float64kasus hasilnya akan terlihat seperti:
df_shifted
A B
0 NaN 1
1 NaN 2
dan
df_shifted.dtypes
A object
B int64
dtype: object
Contoh yang lebih komprehensif
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
Seharusnya terlihat seperti ini
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>. <Gunakan ini sebagai gantinya dan lihatdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object?