Pandas: ERROR: fillna con inplace no funciona con la selección de múltiples columnas por loc

Creado en 11 dic. 2016  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Ejemplo de código, un ejemplo que se puede copiar, si es posible

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, ['C', 'D']].fillna(-1, inplace=True)
display(df)

Salida:

A   B   C   D
0   1.387547    -1.299578   0.360015    1.290783
1   -0.395182   -0.112581   NaN NaN
2   -0.649372   -1.831869   -0.103746   0.533153

Descripción del problema

Se espera que modifique el Nan a -1, pero NO lo hace.

Consulte las siguientes comparaciones.

Comparación (1)

Por el contrario, los siguientes códigos se comportan como se esperaba.
(La única diferencia es la selección por iloc o por loc )

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.iloc[:, 2:4].fillna(-1, inplace=True)
display(df)

Salida:

    A   B   C   D
0   -0.522821   -1.600520   -1.468871   0.715790
1   0.493071    0.722474    -1.000000   -1.000000
2   0.545852    -0.877946   0.993169    -0.582661

Comparación (2)

Cuando solo se selecciona una columna con loc, se comporta correctamente.

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, 'C'].fillna(-1, inplace=True)
display(df)

Salida:

A   B   C   D
0   -0.549106   0.261093    -1.278554   2.017178
1   -1.424498   0.439482    -1.000000   NaN
2   -1.281520   1.190736    0.356319    0.416363

Resultado esperado del primer ejemplo de código

A   B   C   D
0   1.181106    1.101231    -0.198445   0.295238
1   -0.654265   -1.129840   -1.000000   -1.000000
2   -1.070404   0.096556    0.499020    -1.835347

Salida de pd.show_versions()

Pegue la salida aquí pd.show_versions () aquí

VERSIONES INSTALADAS

cometer: Ninguno
python: 3.5.2.final.0
bits de pitón: 64
SO: Linux
Versión del SO: 2.6.32-358.14.1.el6.x86_64
máquina: x86_64
procesador: x86_64
byteorder: pequeño
LC_ALL: Ninguno
IDIOMA: zh_TW.big5
LOCAL: zh_TW.big5

pandas: 0.19.1
nariz: ninguna
pip: 9.0.1
herramientas de configuración: 27.2.0
Cython: Ninguno
numpy: 1.11.2
scipy: 0.18.1
statsmodels: Ninguno
xarray: Ninguno
IPython: 5.1.0
esfinge: ninguna
patsy: Ninguno
dateutil: 2.6.0
pytz: 2016.10
blosc: Ninguno
cuello de botella: Ninguno
tablas: 3.3.0
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Ninguno
xlrd: Ninguno
xlwt: Ninguno
xlsxwriter: Ninguno
lxml: Ninguno
bs4: Ninguno
html5lib: Ninguno
httplib2: Ninguno
apiclient: Ninguno
sqlalchemy: Ninguno
pymysql: Ninguno
psycopg2: Ninguno
jinja2: 2.8
boto: Ninguno
pandas_datareader: Ninguno

Indexing Missing-data Usage Question

Comentario más útil

no solo varias columnas, sino también una columna.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
no funciona,
pero
df.loc[df.id==123, 'num'] = 123
funciona

¿Por qué no editar la función fillna para adaptarla en el futuro?
Parece un error.

Todos 3 comentarios

estás llenando una copia. Usar inplace es un anti-patrón. La mayoría de las operaciones mostrarán un SettingWithCopyWarning , pero en este caso no es fácilmente detectable.

Utilizar

In [11]: df[['C', 'D']] = df[['C', 'D']].fillna(-1)

In [12]: df
Out[12]: 
          A         B         C         D
0  0.236782  1.408896 -0.199882  0.803165
1 -1.763881  0.232414 -1.000000 -1.000000
2  0.878515 -0.394800  0.429696 -1.829569

Prueba esto:
df.loc [:, ['C', 'D']] = df.loc [:, ['C', 'D']]. fillna (-1)
Estaba teniendo la misma dificultad con un .relplace en mi código. Esto funcionó.

no solo varias columnas, sino también una columna.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
no funciona,
pero
df.loc[df.id==123, 'num'] = 123
funciona

¿Por qué no editar la función fillna para adaptarla en el futuro?
Parece un error.

¿Fue útil esta página
0 / 5 - 0 calificaciones