Что от меня хочет Pandas?

ДВС! Преобразую столбец df командой:

use_table['openPrice'] = pd.to_numeric(use_table['openPrice'], errors='coerce')

Но pandas выдает предупреждение

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  use_table['openPrice'] = pd.to_numeric(use_table['openPrice'], errors='coerce')

Код работает, но напрягает это сообщение. Что он от меня хочет? Я так понимаю, он предлагает более правильный вариант, но как его написать, я не понимаю... Помогите пожалуйста)


Ответы (1 шт):

Автор решения: CrazyElf

На самом деле проблема, как это иногда бывает, не в той строке, к которой показывается предупреждение. Воспроизведу проблему:

import pandas as pd

df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
use_table = df[df['a'] > 1]
use_table['b'] = use_table['b'] + 1

Выходит то самое предупреждение:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Почему так? Потому что use_table - это срез таблицы df. И тут возможно два решения - либо вас устраивает, что вы работаете со срезом, вы не хотите возвращаться к таблице df, не хотите в неё вносить изменения. Тогда просто скопируйте таблицу после выборки по условию и предупреждения дальше уже не будет - теперь это новая, отдельная таблица:

use_table = df[df['a'] > 1].copy()

Либо, если вы всё же хотите работать с исходной таблицей, и вносить изменения в неё, то и вносить изменения нужно именно в неё, в данном примере это будет так:

df.loc[df['a'] > 1, 'b'] = df.loc[df['a'] > 1, 'b'] + 1

Зачастую это предупреждение можно игнорировать - изменения попадут и в use_table и в df и вы именно этого и хотели. Но всё же лучше не игнорировать предупреждения и делать всё правильно, чётко понимая, что вы делаете. Pandas ругается не просто так, у него есть сомнения, что вы понимаете, что вы делаете.

→ Ссылка