Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

414
Visualizações
Forma correcta de establecer una nueva columna en pandas DataFrame para evitar SettingWithCopyWarning

Intentando crear una nueva columna en netc df pero recibo la advertencia

 netc["DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM C:\Anaconda\lib\site-packages\ipykernel\__main__.py: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

¿Cuál es la forma correcta de crear un campo en la versión más reciente de Pandas para evitar recibir la advertencia?

 pd.__version__ Out[45]: u'0.19.2+0.g825876c.dirty'
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Como dice en el error, intente usar .loc[row_indexer,col_indexer] para crear la nueva columna.

 netc.loc[:,"DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM.

notas

Según Pandas Indexing Docs , su código debería funcionar.

 netc["DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM

se traduce a

 netc.__setitem__('DeltaAMPP', netc.LOAD_AM - netc.VPP12_AM)

Que debería tener un comportamiento predecible. El SettingWithCopyWarning solo está ahí para advertir a los usuarios de un comportamiento inesperado durante la asignación encadenada (que no es lo que está haciendo). Sin embargo, como se menciona en los documentos,

A veces, aparecerá una advertencia de SettingWithCopy cuando no haya una indexación encadenada obvia. ¡Estos son los errores que SettingWithCopy está diseñado para detectar! Es probable que Pandas esté tratando de advertirte que has hecho esto:

Luego, los documentos continúan brindando un ejemplo de cuándo se puede obtener ese error, incluso cuando no se espera. Así que no puedo decir por qué sucede eso sin más contexto.

over 4 years ago · Santiago Trujillo Relatório

0

Su ejemplo está incompleto, ya que no muestra de dónde proviene netc . Es probable que netc en sí mismo sea el producto de la división y, como tal, Pandas no puede garantizar que no sea una vista o una copia.

Por ejemplo, si estás haciendo esto:

 netc = netb[netb["DeltaAMPP"] == 0] netc["DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM

entonces Pandas no sabría si netc es una vista o una copia. Si fuera una sola línea, efectivamente sería así:

 netb[netb["DeltaAMPP"] == 0]["DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM

donde se puede ver más claramente la doble indexación.

Si desea que netc separe de netb , un posible remedio podría ser forzar una copia en la primera línea (la loc es asegurarse de que no estemos copiando dos veces), como:

 netc = netb.loc[netb["DeltaAMPP"] == 0].copy()

Si, por otro lado, desea modificar netb con la nueva columna, puede hacerlo:

 netb.loc[netb["DeltaAMPP"] == 0, "DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AM
over 4 years ago · Santiago Trujillo Relatório

0

Tuve el SettingWithCopyWarning , al asignar datos a un DataFrame df , que se construyó mediante la indexación. Ambos comandos

  • df['new_column'] = something
  • df.loc[:, 'new_column'] = something

no funcionó sin la advertencia. Tan pronto como copié df ( DataFrame.copy() ) todo estuvo bien.

En el siguiente código, compare df0 = df_test[df_test['a']>3] y df1 = df_test[df_test['a']>3].copy() . Para df0 ambas asignaciones lanzan el Warning. Para df1 ambos funcionan bien.

 >>> df_test abcde 0 0.0 1.0 2.0 3.0 0 1 4.0 5.0 6.0 7.0 1 2 8.0 9.0 10.0 11.0 2 3 12.0 13.0 14.0 15.0 3 4 16.0 17.0 18.0 19.0 4 >>> df0 = df_test[df_test['a']>3] >>> df1 = df_test[df_test['a']>3].copy() >>> df0['e'] = np.arange(4) __main__: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 >>> df1['e'] = np.arange(4) >>> df0.loc[2, 'a'] = 77 /opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py:1719: 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 self._setitem_single_column(loc, value, pi) >>> df1.loc[2, 'a'] = 77 >>> df0 abcde 1 4.0 5.0 6.0 7.0 0 2 77.0 9.0 10.0 11.0 1 3 12.0 13.0 14.0 15.0 2 4 16.0 17.0 18.0 19.0 3 >>> df1 abcde 1 4.0 5.0 6.0 7.0 0 2 77.0 9.0 10.0 11.0 1 3 12.0 13.0 14.0 15.0 2 4 16.0 17.0 18.0 19.0 3

Por cierto: se recomienda leer los documentos sobre este problema (Enlace en Advertencia)

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda