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 str
o converters
argumento 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?
keep_default_na
abaixo.Respostas:
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 quiserEDITAR: 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 resultadofonte
DataFrame.fillna
. Experimenteresult.fillna('', inplace=True)
. Caso contrário, ele cria uma cópia do dataframe.na_values
(lista ou dicionário indexado por colunas) ekeep_default_na
(bool). Okeep_default_na
valor 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 usarpandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)
.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.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.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
:Este problema é mais claramente explicado em
Isso foi corrigido em 19 de agosto de 2012 para o Pandas versão 0.9 em
fonte
Temos um argumento simples no Pandas read_csv para isso:
Usar:
A documentação do Pandas explica claramente como o argumento acima funciona.
Ligação
fonte
na_values
a reconhecer "nan", mas transformarna_filter
por completo derrotaria isso. Assim, minha resposta comkeep_default_na=False
.