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()