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
Se espera que modifique el Nan a -1, pero NO lo hace.
Consulte las siguientes comparaciones.
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
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
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
pd.show_versions()
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
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.
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.