Eu estou tentando preencher nenhum valor em um dataframe do Pandas com 0 para apenas alguns subconjuntos de colunas.
Quando eu faço:
import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df
A saída:
a b c
0 1.0 4.0 NaN
1 2.0 5.0 NaN
2 3.0 NaN 7.0
3 NaN 6.0 8.0
a b c
0 1.0 4.0 0.0
1 2.0 5.0 0.0
2 3.0 0.0 7.0
3 0.0 6.0 8.0
Ele substitui todos os None
por 0
. O que eu quero fazer é substituir apenas None
s em colunas a
e b
, mas não c
.
Qual a melhor maneira para fazer isto?
df[['a', 'b']] = df[['a','b']].fillna(value=0)
continuará a funcionarinplace
ainda funcionará em uma cópia. Não sei se é o casofillna
ou não. Veja esta resposta de um dos principais desenvolvedores do pandas.Você pode usar
dict
,fillna
com valor diferente para coluna diferenteDepois de atribuí-lo de volta
fonte
fromkeys
se quiser, +1df.fillna({'a':0,'b':0}, inplace=True)
Você pode evitar fazer uma cópia do objeto usando a solução de Wen e inplace = True:
Qual produz:
fonte
Veja como você pode fazer tudo em uma linha:
Divisão:
df[['a', 'b']]
seleciona as colunas nas quais você deseja preencher os valores de NaN,value=0
diz para ele preencher os NaNs com zero einplace=True
tornará as alterações permanentes, sem a necessidade de fazer uma cópia do objeto.fonte
o uso da resposta superior gera um aviso sobre como fazer alterações em uma cópia de uma fatia df. Supondo que você tenha outras colunas, a melhor maneira de fazer isso é passar um dicionário:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)
fonte
Ou algo como:
e se houver mais:
fonte
Às vezes, essa sintaxe não funciona:
Use o seguinte:
fonte