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'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.Según Pandas Indexing Docs , su código debería funcionar.
netc["DeltaAMPP"] = netc.LOAD_AM - netc.VPP12_AMse 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
SettingWithCopycuando no haya una indexación encadenada obvia. ¡Estos son los errores queSettingWithCopyestá 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.
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_AMdonde 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_AMTuve el SettingWithCopyWarning , al asignar datos a un DataFrame df , que se construyó mediante la indexación. Ambos comandos
df['new_column'] = somethingdf.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 3Por cierto: se recomienda leer los documentos sobre este problema (Enlace en Advertencia)