Pandas: SettingWithCopyWarning, пытающийся понять, как лучше написать код, а не только игнорировать ли предупреждение

Я пытаюсь изменить все значения даты в столбце Дата электронной таблицы, где год раньше, чем 1900, на сегодняшнюю дату, поэтому у меня есть срез.

РЕДАКТИРОВАТЬ: предыдущие строки кода:

df=pd.read_excel(filename)#,usecols=['NAME','DATE','EMAIL']
#regex to remove weird characters
df['DATE'] = df['DATE'].str.replace(r'[^a-zA-Z0-9\._/-]', '')
df['DATE'] = pd.to_datetime(df['DATE'])

sample row in dataframe: name, date, email
[u'Public, Jane Q.\xa0' u'01/01/2016\xa0' u'jqpublic@email.com\xa0'] 

Эта строка кода работает.

df["DATE"][df["DATE"].dt.year < 1900] = dt.datetime.today()

Затем все значения даты форматируются:

df["DATE"] = df["DATE"].map(lambda x: x.strftime("%m/%d/%y"))

Но я получаю ошибку:

SettingWithCopyWarning:  A value is trying to be set on a copy of a
slice from a DataFrame

See the caveats in the documentation:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-

против-копии

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

Следующее является рекомендуемым решением:

df.loc[row_indexer,col_indexer] = value

но df["DATE"].loc[df["DATE"].dt.year < 1900] = dt.datetime.today() выдает мне ту же ошибку, за исключением того, что номер строки фактически является номером строки после последней строки в скрипте.

Я просто не понимаю, что документация пытается сказать мне, поскольку это относится к моему примеру.

Я начал возиться с извлечением среза и назначением отдельного фрейма данных, но затем мне придется снова соединить их.

2 ответа

Решение

Вы создаете представление, когда вы df["DATE"] и впоследствии использовать селектор [df["DATE"].dt.year < 1900] и попробуйте присвоить ему.

df["DATE"][df["DATE"].dt.year < 1900] это мнение, на которое жалуются панды.

Исправить это с loc как это:

df.loc[df.DATE.dt.year < 1900, "DATE"] = pd.datetime.today()

Я думал, что вы могли бы сделать

df.loc[df.DATE.dt.year < 1900, "DATE"] = dt.datetime.today()
df.loc[:, "DATE"] = df.DATE.map(lambda x: x.strftime("%m/%d/%y")

Не за компьютером, поэтому я не могу проверить, но я думаю, что должен это сделать.

Другие вопросы по тегам