Получение SettingWithCopyWarning. Безопасно ли продолжать? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь заменить столбец 'let' в кадре данных london (который является копией другого no_eco) строками, которые содержат только строки в методе contains(). Код выглядит следующим образом:

london = no_eco
london.loc[:,'let'] = london.loc[:,'let'].str.contains('E' or 'D' or 'F' or 'G' or 'H' or 'I' or 'J')
london.loc[:,'let'] = london.loc[:,'let'][london.loc[:,'let']]
london = london.dropna(subset = ['let'])
print(london)

Код работает, и я отбросил строки, где строки не встречаются, однако я получаю следующее предупреждение:

C:\Users\gerardchurch\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py:543: 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: http://pandas.pydata.org/pandas- docs/stable/indexing.html#indexing-view-versus-copy

и, глядя на документацию, я все еще не могу понять, что я делаю неправильно.

Можно ли продолжать использовать переменную london или у меня возникнут проблемы в будущем?

Спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

Есть несколько проблем с вашим кодом:

  1. london = no_eco не присваивает копию london. Будьте явными: london = no_eco.copy().
  2. pd.Series.str.contains по умолчанию поддерживает регулярные выражения, поэтому используйте str.contains('E|D|F|G|H|I|J|').
  3. Ваша логика запутана. Сначала вы заменяете серию object dtype на логическую серию, затем присваиваете ей подмножество, индексируемое самостоятельно, а затем используете dropna, который предназначен для значений null .

Вместо этого просто создайте логическую серию и используйте pd.DataFrame.loc с логическим индексированием:

london = no_eco.copy()
london = london.loc[london['let'].str.contains('E|D|F|G|H|I|J|')]

Для этого конкретного случая вы можете напрямую использовать pd.DataFrame.__getitem__ (df[] синтаксис):

london = no_eco.copy()
london = london[london['let'].str.contains('E|D|F|G|H|I|J|')]
...