พิจารณา DataFrame 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
มันดันแถวทั้งหมดลงไปหนึ่งแถวตามที่คาดไว้
แต่เมื่อฉันเปลี่ยนไป 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
จากคอลัมน์หนึ่งไปยังคอลัมน์ถัดไป ในกรณีนี้ฉันพยายามบังคับint64
ให้object
คอลัมน์หนึ่งและ Pandas ตัดสินใจที่จะลบล้างค่า
สิ่งนี้จะเป็นปัญหามากขึ้นเมื่อ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
คำถามของฉัน
อะไรคือสิ่งที่ดีสำหรับตัวเลือกการสร้าง dataframe ที่เปลี่ยนไปตามaxis=1
ค่าในซึ่งผลที่ได้เปลี่ยนและ dtypes?
สำหรับ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
?