Os pandas substituem o NaN por uma sequência em branco / vazia

217

Eu tenho um Dataframe do Pandas, como mostrado abaixo:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Quero remover os valores NaN com uma string vazia para que fique assim:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read
user1452759
fonte

Respostas:

260
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Isso pode ajudar. Ele substituirá todos os NaNs por uma sequência vazia.

nEO
fonte
1
de que biblioteca np.nanvem? Eu não posso usá-lo
CaffeineConnoisseur
8
@CaffeineConnoisseur: import numpy as np.
John Zwinck
26
@CaffeineConnoisseur - ou apenas pd.np.nanse você não quiser import numpy.
ElPastor 12/10
1
Isso também permite que o Dict para ser salvo como uma string na linha de um arquivo .csv e, em seguida, depois de lida de volta em uma trama de dados usando opd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin
5
Também é útil mencionar a ... inplace=Trueopção.
smci 24/05/19
340
df = df.fillna('')

ou apenas

df.fillna('', inplace=True)

Isto irá preencher na's (por exemplo, NaN's) com ''.

Se você deseja preencher uma única coluna, pode usar:

df.column1 = df.column1.fillna('')

Pode-se usar em df['column1']vez de df.column1.

fantabolous
fonte
5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor
99

Se você estiver lendo o quadro de dados de um arquivo (por exemplo, CSV ou Excel), use:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Isso considerará automaticamente os campos vazios como cadeias vazias ''


Se você já possui o quadro de dados

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')
Natesh bhat
fonte
na_filter não está disponível em read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell
Eu usei no meu aplicativo. Existe, mas, por alguma razão, eles não deram esse argumento nos documentos. Funciona bem para mim, embora sem erros.
Natesh bhat #
Funciona, eu estou usando-o em análise #xl.parse('sheet_name', na_filter=False)
587 Dmitrii
5

Use um formatador, se você quiser apenas formatá-lo para que seja renderizado corretamente quando impresso . Basta usar o df.to_string(... formatterspara definir a formatação de string personalizada, sem modificar desnecessariamente o DataFrame ou desperdiçar memória:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Para obter:

   A B       C
0  a      read
1  b 1  unread
2  c      read
Steve Schulist
fonte
4
print df.fillna('')por si só (sem fazer df = df.fillna('')) também não modifica o original. Existe uma velocidade ou outra vantagem em usar to_string?
fantabolous
É justo, df.fillna('')é!
9788 Steve Schulist
@shadowtalker: Não necessariamente, seria a resposta correta se o OP quisesse manter o df em um formato (por exemplo, mais eficiente em termos de computação ou economizar memória em cadeias desnecessárias / vazias / duplicadas), mas renderizá-lo visualmente de uma maneira mais maneira agradável. Sem saber mais sobre o caso de uso, não podemos dizer com certeza.
smci 24/05/19
2

Tente isso,

adicionar inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)
Vineesh TP
fonte
1

usando keep_default_na=False deve ajudá-lo a:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
fonte
0

Se você estiver convertendo trama de dados para JSON, NaNvai dar erro tão melhor solução é neste caso de uso é substituir NaNcom None.
Aqui está como:

df1 = df.where((pd.notnull(df)), None)
Dinesh Khetarpal
fonte
0

Eu tentei com uma coluna de valores de seqüência com nan.

Para remover o nan e preencher a cadeia vazia:

df.columnname.replace(np.nan,'',regex = True)

Para remover a nan e preencher alguns valores:

df.columnname.replace(np.nan,'value',regex = True)

Eu tentei o df.iloc também. mas precisa do índice da coluna. então você precisa olhar para a mesa novamente. simplesmente o método acima reduziu um passo.

Subbu VidyaSekar
fonte