Путаница в отношении: копия панда предупреждение о кадре данных
Я просмотрел кучу вопросов и ответов, связанных с этой проблемой, но все еще обнаруживаю, что получаю эту копию предупреждения о срезах в местах, где я этого не ожидаю. Кроме того, он появляется в коде, который раньше работал нормально для меня, что заставляет меня задуматься о том, может ли какое-то обновление быть виновником.
Например, это набор кода, где все, что я делаю, это чтение в файле Excel в пандыDataFrame
и вырезать набор столбцов, включенных вdf[[]]
синтаксис.
izmir = pd.read_excel(filepath)
izmir_lim = izmir[['Gender','Age','MC_OLD_M>=60','MC_OLD_F>=60','MC_OLD_M>18','MC_OLD_F>18','MC_OLD_18>M>5','MC_OLD_18>F>5',
'MC_OLD_M_Child<5','MC_OLD_F_Child<5','MC_OLD_M>0<=1','MC_OLD_F>0<=1','Date to Delivery','Date to insert','Date of Entery']]
Теперь любые дальнейшие изменения, которые я делаю в этомizmir_lim
файл поднять копию среза предупреждение.
izmir_lim['Age'] = izmir_lim.Age.fillna(0)
izmir_lim['Age'] = izmir_lim.Age.astype(int)
/Users/samlilienfeld/anaconda/lib/python3.5/site-packages/ipykernel/главный.py: 2: SettingWithCopyWarning: пытается установить значение для копии среза из DataFrame. Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение
Я в замешательстве, потому что я думал, чтоdf[[]]
Подмножество столбцов вернуло копию по умолчанию. Единственный способ, который я нашел для подавления ошибок, это явное добавлениеdf[[]].copy()
, Я мог поклясться, что в прошлом мне не нужно было этого делать, и я не поднял копию ошибки среза.
Точно так же у меня есть некоторый другой код, который выполняет функцию на фрейме данных, чтобы фильтровать его определенным образом:
def lim(df):
if (geography == "All"):
df_geo = df
else:
df_geo = df[df.center_JO == geography]
df_date = df_geo[(df_geo.date_survey >= start_date) & (df_geo.date_survey <= end_date)]
return df_date
df_lim = lim(df)
С этого момента, любые изменения, которые я делаю в любое из значенийdf_lim
поднять копию ошибки среза. Единственный способ обойти это, что я нашел, это изменить вызов функции на:
df_lim = lim(df).copy()
Это просто кажется мне неправильным. Что мне не хватает? Кажется, что эти варианты использования должны возвращать копии по умолчанию, и я мог поклясться, что в последний раз, когда я запускал эти сценарии, я не запускал эти ошибки.
Мне просто нужно начать добавлять.copy()
повсюду? Похоже, должен быть более чистый способ сделать это. Любое понимание или помощь очень ценится.