Pandas: ERRO: fillna com inplace não funciona com seleção de múltiplas colunas por loc

Criado em 11 dez. 2016  ·  3Comentários  ·  Fonte: pandas-dev/pandas

Amostra de código, um exemplo copiável e colável, se possível

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)

Resultado:

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

Descrição do Problema

É esperado que modifique Nan para -1, mas NÃO .

Por favor, veja as comparações a seguir.

Comparação (1)

Ao contrário, os códigos a seguir se comportam conforme o esperado.
(A única diferença é a seleção por iloc ou 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)

Resultado:

    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

Comparação (2)

Quando apenas uma coluna é selecionada com loc, ela se comporta corretamente.

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)

Resultado:

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

Saída esperada da primeira amostra 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

Resultado de pd.show_versions()

Cole a saída aqui pd.show_versions () aqui

VERSÕES INSTALADAS

commit: Nenhum
python: 3.5.2.final.0
python-bits: 64
SO: Linux
Versão do SO: 2.6.32-358.14.1.el6.x86_64
máquina: x86_64
processador: x86_64
byteorder: pouco
LC_ALL: Nenhum
LANG: zh_TW.big5
LOCALE: zh_TW.big5

pandas: 0.19.1
nariz: nenhum
pip: 9.0.1
ferramentas de configuração: 27.2.0
Cython: Nenhum
entorpecido: 1.11.2
scipy: 0.18.1
modelos de estatísticas: nenhum
xarray: Nenhum
IPython: 5.1.0
esfinge: nenhuma
patsy: nenhum
dateutil: 2.6.0
pytz: 2016.10
blosc: nenhum
gargalo: Nenhum
tabelas: 3.3.0
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Nenhum
xlrd: Nenhum
xlwt: Nenhum
xlsxwriter: Nenhum
lxml: Nenhum
bs4: Nenhum
html5lib: Nenhum
httpplib2: Nenhum
apiclient: Nenhum
sqlalchemy: Nenhum
pymysql: Nenhum
psycopg2: Nenhum
jinja2: 2.8
boto: Nenhum
pandas_datareader: Nenhum

Indexing Missing-data Usage Question

Comentários muito úteis

não apenas várias colunas, mas também uma coluna.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
não funciona,
mas
df.loc[df.id==123, 'num'] = 123
funciona

por que não editar a função fillna para adaptá-la no futuro.
Parece um bug.

Todos 3 comentários

você está preenchendo uma cópia. Usar inplace é um antipadrão. A maioria das operações mostrará SettingWithCopyWarning , mas neste caso não é facilmente detectável.

Usar

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

Experimente isto:
df.loc [:, ['C', 'D']] = df.loc [:, ['C', 'D']]. fillna (-1)
Eu estava tendo a mesma dificuldade com um .relplace no meu código. Isso funcionou.

não apenas várias colunas, mas também uma coluna.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
não funciona,
mas
df.loc[df.id==123, 'num'] = 123
funciona

por que não editar a função fillna para adaptá-la no futuro.
Parece um bug.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

nathanielatom picture nathanielatom  ·  3Comentários

venuktan picture venuktan  ·  3Comentários

matthiasroder picture matthiasroder  ·  3Comentários

MatzeB picture MatzeB  ·  3Comentários

ericdf picture ericdf  ·  3Comentários