2014-05-15 25 views
7

tôi nhận được SettingWithCopyWarning sai sót trong trường hợp tôi không mong chờ họ (?):SettingWithCopyWarning, ngay cả khi sử dụng loc

N.In <38>: # Column B does not exist yet 
N.In <39>: df['B'] = df['A']/25 
N.In <40>: df['B'] = df['A']/50 

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_index,col_indexer] = value instead 
    self.obj[item] = s 

N.In <41>: df.loc[:,'B'] = df['A']/50 

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_index,col_indexer] = value instead 
    self.obj[item] = s 

Tại sao nó xảy ra trong trường hợp 1 và 2?

+0

bạn cần hiển thị cá tuyết e trước khi điều này (nhiều như u có thể) – Jeff

+0

Cảm ơn @ Jeff tôi cập nhật các OP với một vài dòng trước –

+0

Thêm trước đó; u r thực hiện một hoạt động tại chỗ trước đây – Jeff

Trả lời

7

Trong trường hợp 1, df['A'] tạo bản sao df. Như được giải thích bởi các Pandas documentation, điều này có thể dẫn đến kết quả bất ngờ khi chuỗi, do đó một cảnh báo được nâng lên. Trường hợp 2 có vẻ chính xác, nhưng dương tính giả là có thể:

Cảnh báo: Cảnh báo chuyển nhượng/ngoại lệ được nhắm đến thông báo cho người dùng về việc chuyển nhượng có thể không hợp lệ. Có thể có sai số tích cực; các tình huống trong đó việc chuyển nhượng chuỗi bị vô tình được báo cáo.

Để tắt SettingWithCopyWarning cho một dataframe duy nhất, sử dụng

df.is_copy = False 

Để tắt các cảnh báo chuyển nhượng xích hoàn toàn, sử dụng

options.mode.chained_assignment = None 
+0

Sử dụng các mục sau đây để tắt cảnh báo: 'pd.set_option ('chained_assignment', None)' – danger89

3

Một giải pháp mà nên ngăn chặn các cảnh báo:

df = df.copy() 
df['B'] = df['A']/25 
df['B'] = df['A']/50 
+1

Điều này thực sự hiệu quả. Không hoàn toàn hiểu nếu điều này bây giờ nhanh hơn hoặc nhiều bộ nhớ tiêu thụ. Tôi không biết tác động của lệnh copy(). Vì trên thực tế bản sao được gán lại cho df .. Có vẻ như không có gì thay đổi ở cuối. – danger89

Các vấn đề liên quan