1
resposta

Erro ao fazer um Selecao

Boa tarde,

Estou fazendo uma seleção, conforme ensinado no curso e está apresentando o seguinte erro:


selecao = df_total['Ativo'].str.len() >= 7
df_opcoes = df_total[selecao]
df_opcoes['L/P'] = df_opcoes['Financeiro Venda'] - df_opcoes['Financeiro Compra']
df_opcoes

Error:
<ipython-input-138-b358a47a8cb5>:1: 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

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_opcoes['L/P'] = df_opcoes['Financeiro Venda'] - df_opcoes['Financeiro Compra']
1 resposta

Olá,

Toda vez que você faz um "slice" de um DataFrame (um filtro), o pandas por trás gera uma "view" desse DataFrame, como se fosse uma cópia na memória para refletir seu filtro, o que não significa que aquela cópia é o DataFrame original, e esse é o motivo do erro. É um conceito confuso e te garanto que você não está sozinho nessa confusão, todo mundo passa por isso. Abaixo um exemplo para te ajudar a corrigir isso:

selecao = df_total['Ativo'].str.len() >= 7 # isso te retornou um vetor de True/False onde todo True atende sua condição
df_opcoes = df_total[selecao] # isso gerou uma 'slice' do sou DataFrame só com as linhas que atendem sua condição, quer seria apenas uma visão do df_total, mudanças no seu df_opcoes não serão refletidas no seu df_total
df_opcoes['L/P'] = # nessa linha você está tentando editar/sobrescrever os dados de uma cópia do seu df_total original, e ai está o erro, o pandas não permite isso (antigamente só emitia warnings, mas isso fazia que muita gente desabilitasse o warning e seguisse em frente com erros)

Uma opção seria:

selecao = df_total['Ativo'].str.len() >= 7
df_opcoes = df_total[selecao].index # aqui você vai pegar apenas o index das linhas que você quer editar
df_total.loc[df_opcoes, 'L/P'] = df_total['Financeiro Venda'] - df_total['Financeiro Compra'] # a mudança aqui é que você está editando o df_total, se você deseja preservar os valor o ideal seria criar uma cópia. A função .loc precisa de [index, coluna], e como agora seu df_opcoes possui o index, ele atende as condições. Ainda que na subtração você não esteja utilizando o df_total filtrado, como dentro do seu .loc você utilizou um index, apenas as linhas do index serão alteradas
df_opcoes

Pandas é poderoso, mas essa parte é confusa no começo.

Abs