Невозможно объяснить, почему происходит SettingWithCopyError (Python 2.7, Pandas 0.20.3) - PullRequest
0 голосов
/ 01 мая 2018

Я получаю SettingWithCopyError, и хотя я обнаружил проблемную строку кода, я не могу понять, почему возникает ошибка.

Функция проблемы следующая:

def filter_log(df, search_string):
    results = df.loc[df['Message'].str.contains(search_string)]
    results.loc[:,'Duration'] = results.index.to_series().diff()
    results.loc[:,'Duration'] = results['Duration'].apply(lambda x: x.total_seconds())
    results = results.dropna(subset=['Duration'])

    results['Day'] = results.index.floor('d')
    results.loc[:,'Day'] = results['Day'].apply(lambda x: x.strftime('%Y-%m-%d'))

    return results

Функция принимает фрейм данных и строку поиска в качестве входных данных и возвращает отфильтрованный / обработанный фрейм данных в качестве результата.

Ошибка в строке 3 - results.loc[:,'Duration'] = results.index.to_series().diff()

В этой строке вычисляются приращения времени между каждой строкой кадра данных с помощью метода .diff () в индексе datetime входного кадра данных.

Однако я, похоже, правильно использую индексацию .loc, и мне не следует ничего устанавливать для копии. Интересно, что ошибка возникает только при первом запуске скрипта в интерактивной среде (или каждый раз, когда я запускаю его автономно). При выполнении после первого запуска в интерактивной среде ошибка не возникает.

Полная трассировка стека выглядит следующим образом:

Traceback (most recent call last):

  File "<ipython-input-1-d72a02ad5f86>", line 1, in <module>
    runfile('C:/00_Projects/99_Misc/aqis_log_analyser/aqis_log_analyser.py', wdir='C:/00_Projects/99_Misc/aqis_log_analyser')

  File "C:\apps\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 710, in runfile
    execfile(filename, namespace)

  File "C:\apps\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 86, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/00_Projects/99_Misc/aqis_log_analyser/aqis_log_analyser.py", line 137, in <module>
    search_results = filter_log(log_df, search_string).loc[start:end]

  File "C:/00_Projects/99_Misc/aqis_log_analyser/aqis_log_analyser.py", line 94, in filter_log
    results.loc[:,'Duration'] = results.index.to_series().diff()

  File "C:\apps\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 179, in __setitem__
    self._setitem_with_indexer(indexer, value)

  File "C:\apps\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 337, in _setitem_with_indexer
    self.obj[key] = _infer_fill_value(value)

  File "C:\apps\Anaconda2\lib\site-packages\pandas\core\frame.py", line 2331, in __setitem__
    self._set_item(key, value)

  File "C:\apps\Anaconda2\lib\site-packages\pandas\core\frame.py", line 2404, in _set_item
    self._check_setitem_copy()

  File "C:\apps\Anaconda2\lib\site-packages\pandas\core\generic.py", line 1871, in _check_setitem_copy
    raise SettingWithCopyError(t)

SettingWithCopyError: 
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

Любые предложения относительно того, что может быть причиной ошибки в этом случае?

1 Ответ

0 голосов
/ 01 мая 2018

Основная причина SettingWithCopyError обычно появляется за несколько строк до строки, упомянутой в трассировке. Здесь вы намерены скопировать подмножество df в новый DataFrame, изменить этот новый DataFrame и вернуть его. Панды не уверены, хотите ли вы это сделать или намеревались изменить оригинал df.

Добавление явного .copy() должно устранить предупреждение:

results = df.loc[df['Message'].str.contains(search_string)].copy()

Дальнейшее чтение: https://www.dataquest.io/blog/settingwithcopywarning/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...