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 dtype
dan ketika bergeser, ada protokol yang jelas tentang bagaimana menangani nilai yang diperkenalkan NaN
di awal atau akhir. Tetapi ketika bergeser, axis=1
kami memperkenalkan potensi ambiguitas dtype
dari satu kolom ke kolom berikutnya. Dalam hal ini, saya mencoba untuk memaksa int64
ke dalam object
kolom dan Pandas memutuskan untuk hanya membatalkan nilai.
Ini menjadi lebih bermasalah ketika dtypes
ada int64
danfloat64
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=1
di mana hasilnya telah bergeser nilai dan tipe?
Untuk int64
/ float64
kasus 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
?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']))
Jawaban:
Ternyata Panda bergeser dari blok yang sama
dtypes
Tentukan
df
sebagaiIni akan menggeser bilangan bulat ke kolom bilangan bulat berikutnya, mengapung ke kolom mengapung berikutnya dan objek ke kolom objek berikutnya
Saya tidak tahu apakah itu ide yang baik, tapi itu adalah apa yang terjadi.
Pendekatan
astype(object)
pertamatranspose
Akan berhasil
object
itertuples
Meskipun saya mungkin akan melakukan ini
sumber
str
dytpes, maka itu berfungsi dengan baik, jika Anda melakukan hal yang sama pada dyt ini,df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
itu menggeser'XY'
kolom ke'F'
kolom, ini jelas salah bagi saya, versi panda saya adalah0.24.2
, ia harus melakukandtype
promosi dan tidak menggeser kolom sedemikian rupa. a waySaya mencoba menggunakan
numpy
metode. Metode ini berfungsi selama Anda menyimpan data dalam array yang numpy:Tetapi ketika Anda memanggil
DataFrame
konstructer, semua kolom dikonversi keobject
meskipun nilai dalam array adalahfloat, int, object
:sumber