Я получаю 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
Любые предложения относительно того, что может быть причиной ошибки в этом случае?