Giả sử tôi có một khung dữ liệu như thế này, với cột đầu tiên "dày đặc" và cột thứ hai "thưa thớt":
# trăn 3.7.1, gấu trúc 0.23.4.
nhập gấu trúc dưới dạng pd
df = pd.DataFrame({'col1':range(1,5), 'col2': [5, '', 7, '']})
thiếu_values_index = df[df['col2'] == ''].index
Tôi đã thử hai phương pháp để chuyển đổi col1 giá trị được gán cho col2 Thiếu giá trị.
Cách 1 (không hoạt động, df vẫn giữ nguyên):
df.loc[missing_values_index]['col2'] = df.loc[missing_values_index]['col1']
Cách 2 (hoạt động tốt):
df.loc[missing_values_index, 'col2'] = df.loc[missing_values_index, 'col1']
Tôi nghĩ đây chỉ là hai cách viết giống nhau. Có ai có thể giải thích chính xác chuyện gì đang xảy ra ở đây không?
Phương pháp thứ hai mà bạn đề cập "hoạt động tốt", vậy hãy cùng nói về lý do tại sao phương pháp đầu tiên không hoạt động!
Tôi nghĩ vấn đềcốt lõilà khi chúng ta cố gắngbản sao của đối tượngThay vì khi gán giá trị cho chính đối tượng đó. Tôi có thể viết lại phương pháp đầu tiên của bạn như thế này:
cái gì đó = df.loc[missing_values_index]
something['col2'] = df.loc[missing_values_index]['col1']
Bây giờ vấn đề trở nên rõ ràng. theodocumentation ,KHÔNGBiết rằng dòng đầu tiên được tạo Xem
hoặcsao chép
. Đó là lý do tại sao nó ném Cài đặtVới bản sao
Cảnh báo và chặn bài tập của bạn vì nếu Pandas không thể xác định xem bài tập của bạn có hợp lệ hay không thì nó sẽ không cho phép bạn hoàn thành nó!
Tôi là một lập trình viên xuất sắc, rất giỏi!