Tôi rất bối rối với các phương pháp lập chỉ mục khác nhau bằng cách sử dụng iloc
trong gấu trúc.
Giả sử tôi đang cố gắng chuyển đổi Dataframe 1-d thành Dataframe 2-d. Đầu tiên tôi có Dataframe 1-d sau đây
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Và tôi sẽ chuyển đổi nó thành Dataframe 2 chiều với kích thước 2x4
. Tôi bắt đầu bằng cách đặt trước Dataframe 2-d như sau:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Sau đó, tôi sử dụng for-loop để giúp tôi chuyển đổi a_df
(1-d) thành b_df
(2-d) với mã sau
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Nó chỉ cho tôi kết quả như sau
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Nhưng khi tôi đổi b_df.iloc[i,:]
thành b_df.iloc[i][:]
. Kết quả đúng như sau, đây là điều tôi muốn
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Bất cứ ai có thể giải thích cho tôi sự khác biệt giữa .iloc[i,:]
và .iloc[i][:]
là gì, và tại sao .iloc[i][:]
làm việc trong ví dụ của tôi ở trên nhưng không.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
gán một chuỗi có chỉ mục[4, 5, 6, 7]
cho một chuỗi có chỉ mục[0, 1, 2, 3]
. Không có sự trùng lặp đểNaN
s được gán cho tất cả các yếu tố. Cho đến thời điểm này nó có ý nghĩa với tôi. Nhưng giống như bạn, tôi không rõ tại sao lạib_df.iloc[1][:] = ...
cư xử khác nhau khi kiểm tra các đối tượngb_df.iloc[1]
vàb_df.iloc[1][:]
không cho thấy sự khác biệt giữa các chỉ số. Dự đoán tốt nhất của tôi sẽ là việc gán trực tiếp vào một bản sao ([:]
) được coi là trường hợp đặc biệt của Pandas, điều này khiến nó bỏ qua chỉ mục của người được chuyển nhượng và tạo ra sự khác biệt này.