Obtenha pandas.read_csv para ler valores vazios como string vazia em vez de nan

95

Estou usando a biblioteca do pandas para ler alguns dados CSV. Em meus dados, certas colunas contêm strings. A string "nan"é um valor possível, assim como uma string vazia. Consegui fazer os pandas lerem "nan" como uma string, mas não consigo descobrir como fazer com que não leia um valor vazio como NaN. Aqui estão dados de amostra e saída

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

Ele lê "nan" corretamente como a string "nan ', mas ainda lê as células vazias como NaN. Tentei passar stro convertersargumento para read_csv (com converters={'One': str})), mas ainda lê as células vazias como NaN.

Sei que posso preencher os valores após a leitura, com fillna, mas não há realmente nenhuma maneira de dizer aos pandas que uma célula vazia em uma coluna CSV específica deve ser lida como uma string vazia em vez de NaN?

BrenBarn
fonte
Observe a resposta mais simples usando a opção mais recente keep_default_naabaixo.
nealmcb

Respostas:

55

Eu adicionei um tíquete para adicionar uma opção de algum tipo aqui:

https://github.com/pydata/pandas/issues/1450

Nesse ínterim, result.fillna('')deve fazer o que quiser

EDITAR: na versão de desenvolvimento (para ser 0.8.0 final) se você especificar uma lista vazia de na_values, strings vazias permanecerão strings vazias no resultado

Wes McKinney
fonte
11
Documentação para DataFrame.fillna. Experimente result.fillna('', inplace=True). Caso contrário, ele cria uma cópia do dataframe.
Sergey Orshanskiy,
1
desculpe ressuscitar uma resposta tão antiga, mas isso já aconteceu? Pelo que eu posso dizer a partir deste GitHub PR, ele foi fechado sem nunca ter sido mesclado e não estou vendo o comportamento solicitado no pandas versão 0.14.x
drammock
9
A documentação para read_csv agora oferece na_values(lista ou dicionário indexado por colunas) ekeep_default_na (bool). O keep_default_navalor indica se os valores NA padrão dos pandas devem ser substituídos ou anexados. O código do OP não funciona atualmente apenas porque está faltando este sinalizador. Para este exemplo, você pode usar pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado
@delgadom Obrigado por me levar a keep_default_na. Mas observe que ele também não quer que 'nan' seja tratado como um padrão. Eu adicionei uma explicação mais completa como uma nova resposta.
nealmcb
correu para isso novamente. a correção é fácil (a melhor resposta é a seguinte keep_default_na=False), mas o comportamento padrão do pandas nisso é IMO ruim. se por algum motivo o pandas read_csv inferir que uma coluna não é numérica, ele não deve alterar automaticamente as strings vazias para NaN.
pietroppeter
108

Eu ainda estava confuso depois de ler as outras respostas e comentários. Mas a resposta agora parece mais simples, então aqui está.

Desde a versão Pandas 0.9 (de 2012), você pode ler seu csv com células vazias interpretadas como strings vazias simplesmente definindo keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)

Este problema é mais claramente explicado em

Isso foi corrigido em 19 de agosto de 2012 para o Pandas versão 0.9 em

nealmcb
fonte
4
Esta é claramente a melhor resposta, deve ser designada como primeira solução. Obrigado @nealmcb
dzof31
2
Por que esta não é uma resposta mais popular? Procuro essa solução desde ontem. Obrigado!
anish
7

Temos um argumento simples no Pandas read_csv para isso:

Usar:

df = pd.read_csv('test.csv', na_filter= False)

A documentação do Pandas explica claramente como o argumento acima funciona.

Ligação

Sundeep
fonte
Parece o OP não quer usar na_valuesa reconhecer "nan", mas transformar na_filterpor completo derrotaria isso. Assim, minha resposta com keep_default_na=False.
nealmcb