2016-06-13 2 views
3

У меня есть файл csv, который я импортирую в качестве фрейма данных. Этот блок данных проходит через несколько этапов фильтрации. Данные также перемещаются между столбцами на основе условных выражений.Создание нового фрейма данных из существующих - SettingWithCopyWarning

import numpy as np 
import pandas as pd 

df = pd.read_csv('my_csv_file.csv', names=headers) 
df2 = df.drop_duplicates(['Column_X']) 
series1 = df2.loc[df2['Column_Y'] == 'Category1', 'Column_X'] 
df2.loc[df2['Column_Y'] == 'Category1', 'Column_Z'] = series1 
... 

После того, как последняя строка введена в командную строку, я получаю значение SettingWithCopyWarning.

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. 

Обратите внимание, что я использовал .loc в своем коде.

Выполнение следующих не бросает ошибку:

df.loc[df['Column_Y'] == 'Category1', 'Column_Z'] = series1 

Что заставляет меня думать, что проблема заключается в использовании df2 как новый dataframe.

ответ

1

Я считаю, что проблема заключается в том, что df2 является видом df1. Вместо этого поставьте .copy() в конце вызова .drop_duplicates.

df2 = df.drop_duplicates(['Column_X']).copy()