Mục đích chính là để tránh lập chỉ mục chuỗi và loại bỏ SettingWithCopyWarning
.
Ở đây lập chỉ mục chuỗi là một cái gì đó như dfc['A'][0] = 111
Tài liệu cho biết nên tránh lập chỉ mục chuỗi trong Trả lại chế độ xem so với bản sao . Đây là một ví dụ sửa đổi một chút từ tài liệu đó:
In [1]: import pandas as pd
In [2]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [3]: dfc
Out[3]:
A B
0 aaa 1
1 bbb 2
2 ccc 3
In [4]: aColumn = dfc['A']
In [5]: aColumn[0] = 111
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [6]: dfc
Out[6]:
A B
0 111 1
1 bbb 2
2 ccc 3
Đây aColumn
là chế độ xem và không phải là bản sao từ Khung dữ liệu gốc, do đó sửa đổi aColumn
cũng sẽ khiến bản gốc dfc
bị sửa đổi. Tiếp theo, nếu chúng ta lập chỉ mục hàng trước:
In [7]: zero_row = dfc.loc[0]
In [8]: zero_row['A'] = 222
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [9]: dfc
Out[9]:
A B
0 111 1
1 bbb 2
2 ccc 3
Lần này zero_row
là một bản sao, vì vậy bản gốcdfc
không được sửa đổi.
Từ hai ví dụ trên, chúng tôi thấy không rõ liệu bạn có muốn thay đổi DataFrame gốc hay không. Điều này đặc biệt nguy hiểm nếu bạn viết một cái gì đó như sau:
In [10]: dfc.loc[0]['A'] = 333
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [11]: dfc
Out[11]:
A B
0 111 1
1 bbb 2
2 ccc 3
Lần này nó không hoạt động. Ở đây chúng tôi muốn thay đổi dfc
, nhưng chúng tôi thực sự đã sửa đổi một giá trị trung gian dfc.loc[0]
là bản sao và bị loại bỏ ngay lập tức. Rất khó để dự đoán liệu giá trị trung gian như dfc.loc[0]
hay dfc['A']
là một chế độ xem hay bản sao, do đó, không đảm bảo liệu DataFrame gốc có được cập nhật hay không. Đó là lý do tại sao nên tránh lập chỉ mục chuỗi và gấu trúc tạo ra SettingWithCopyWarning
bản cập nhật lập chỉ mục chuỗi này.
Bây giờ là việc sử dụng .copy()
. Để loại bỏ cảnh báo, hãy tạo một bản sao để thể hiện rõ ràng ý định của bạn:
In [12]: zero_row_copy = dfc.loc[0].copy()
In [13]: zero_row_copy['A'] = 444 # This time no warning
Vì bạn đang sửa đổi một bản sao, bạn biết bản gốc dfc
sẽ không bao giờ thay đổi và bạn không mong đợi nó sẽ thay đổi. Kỳ vọng của bạn phù hợp với hành vi, sau đó SettingWithCopyWarning
biến mất.
Lưu ý, nếu bạn muốn sửa đổi DataFrame gốc, tài liệu đề nghị bạn sử dụng loc
:
In [14]: dfc.loc[0,'A'] = 555
In [15]: dfc
Out[15]:
A B
0 555 1
1 bbb 2
2 ccc 3