Hãy xem xét khung dữ liệu df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
Nếu tôi thay đổi axis=0
(mặc định)
df.shift()
A B
0 NaN NaN
1 1.0 X
Nó đẩy tất cả các hàng xuống dưới một hàng như mong đợi.
Nhưng khi tôi thay đổi axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Mọi thứ đều vô giá trị khi tôi mong đợi
A B
0 NaN 1
1 NaN 2
Tôi hiểu tại sao điều này xảy ra. Đối với axis=0
, Pandas đang vận hành cột theo cột trong đó mỗi cột là một dtype
và khi chuyển đổi, có giao thức rõ ràng về cách xử lý NaN
giá trị được giới thiệu ở đầu hoặc cuối. Nhưng khi chuyển dọc, axis=1
chúng tôi giới thiệu sự mơ hồ tiềm năng dtype
từ cột này sang cột khác. Trong trường hợp này, tôi đang cố gắng ép buộc int64
vào một object
cột và Pandas quyết định chỉ vô hiệu hóa các giá trị.
Điều này trở nên khó giải quyết hơn khi dtypes
là int64
vàfloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
Và điều tương tự xảy ra
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Câu hỏi của tôi
Các tùy chọn tốt để tạo một khung dữ liệu được dịch chuyển dọcaxis=1
đó kết quả đã thay đổi giá trị và kiểu chữ là gì?
Đối với int64
/ float64
trường hợp, kết quả sẽ như sau:
df_shifted
A B
0 NaN 1
1 NaN 2
và
df_shifted.dtypes
A object
B int64
dtype: object
Một ví dụ toàn diện hơn
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
Nên như thế này
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
>. <Sử dụng thay thế và xemdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object
?