Путаница в отношении: копия панда предупреждение о кадре данных

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

Например, это набор кода, где все, что я делаю, это чтение в файле 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() повсюду? Похоже, должен быть более чистый способ сделать это. Любое понимание или помощь очень ценится.

Ответы на вопрос(1)

Ваш ответ на вопрос