Confusão re: pandas cópia da fatia de aviso dataframe
Analisei várias perguntas e respostas relacionadas a esse problema, mas continuo descobrindo que estou recebendo esta cópia do aviso de fatia em locais onde não o espero. Além disso, está surgindo um código que estava funcionando bem para mim anteriormente, levando-me a pensar se algum tipo de atualização pode ser o culpado.
Por exemplo, este é um conjunto de códigos em que tudo o que estou fazendo é ler um arquivo do Excel em um pandaDataFrame
e cortando o conjunto de colunas incluídas nodf[[]]
sintaxe.
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']]
Agora, quaisquer outras alterações que eu fizer nesteizmir_lim
arquivo aumentar a cópia do aviso de fatia.
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/a Principal.py: 2: SettingWithCopyWarning: um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame. Tente usar .loc [index_dax, col_indexer] = value
Estou confuso porque pensei que odf[[]]
o subconjunto de colunas retornou uma cópia por padrão. A única maneira que encontrei para suprimir os erros é adicionando explicitamentedf[[]].copy()
. Eu poderia jurar que, no passado, não precisava fazer isso e não levantei a cópia do erro de fatia.
Da mesma forma, eu tenho outro código que executa uma função em um quadro de dados para filtrá-lo de certas maneiras:
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)
Desse ponto em diante, quaisquer alterações que eu fizer em qualquer um dos valores dedf_lim
aumente a cópia do erro de fatia. A única maneira de contornar isso que encontrei é alterar a chamada de função para:
df_lim = lim(df).copy()
Isso parece errado para mim. o que estou perdendo? Parece que esses casos de uso devem retornar cópias por padrão, e eu poderia jurar que, na última vez em que executei esses scripts, não estava executando esses erros.
Eu só preciso começar a adicionar.copy()
por todo o lugar? Parece que deve haver uma maneira mais limpa de fazer isso. Qualquer insight ou ajuda é muito apreciada.