python pandas dataframe chained-assignment

python - Acción con pandas SettingWithCopyWarning



dataframe chained-assignment (1)

Intento delete alguna columna y convertir algún valor en columna con

df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True) df2[''date''] = df2[''date''].map(lambda x: str(x)[1:]) df2[''date''] = df2[''date''].str.replace('':'', '' '', 1) df2[''date''] = pd.to_datetime(df2[''date''])

y a toda esta cadena me sale

df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True) C:/Users/����� �����������/Desktop/projects/youtube_log/filter.py:11: 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 el problema allí?


Su df2 es una porción de otro marco de datos. df2 = df2.copy() copiarlo explícitamente con df2 = df2.copy() justo antes de intentar drop

Considere el siguiente marco de datos:

import pandas as pd import numpy as np df1 = pd.DataFrame(np.arange(20).reshape(4, 5), list(''abcd''), list(''ABCDE'')) df1

Déjame asignar una porción de df1 a df2

df2 = df1[[''A'', ''C'']]

df2 ahora es una porción de df1 y debería desencadenar esos molestos SettingWithCopyWarning de SettingWithCopyWarning si intentamos cambiar las cosas en df2 . Vamos a ver.

df2.drop(''c'')

No hay problemas. Qué tal si:

df2.drop(''c'', inplace=True)

Ahí está:

El problema es que los pandas intentan ser eficientes y rastrea que df2 apunta a los mismos datos que df1 . Es preservar esa relación. La advertencia le dice que no debe intentar meterse con el marco de datos original a través del segmento.

Tenga en cuenta que cuando miramos df2 , la fila ''c'' se ha eliminado.

df2

Y mirando df1 vemos que la fila ''c'' todavía está allí.

df1

los pandas hicieron una copia de df2 luego soltaron la fila ''c''. Esto es potencialmente inconsistente con lo que nuestra intención pudo haber sido considerando que hicimos una porción de df2 y apuntamos a los mismos datos que df1 . Entonces los pandas nos están advirtiendo.

Para no ver la advertencia, haga la copia usted mismo.

df2 = df2.copy() # or df2 = df1[[''A'', ''C'']].copy()