Eu li dados de um arquivo .csv em um dataframe do Pandas, como abaixo. Para uma das colunas, a saber id
, desejo especificar o tipo de coluna como int
. O problema é que a id
série tem valores ausentes / vazios.
Quando tento converter a id
coluna em inteiro enquanto lê o arquivo .csv, recebo:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Como alternativa, tentei converter o tipo de coluna depois de ler como abaixo, mas desta vez recebo:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Como posso resolver isso?
Respostas:
A falta de NaN rep em colunas inteiras é um panda "pegadinha" .
A solução usual é simplesmente usar carros alegóricos.
fonte
df = df.astype(pd.Int32Dtype())
(para converter todo o dataFrame ou)df['col'] = df['col'].astype(pd.Int32Dtype())
. Outros tipos de número nulo aceitos sãopd.Int16Dtype
epd.Int64Dtype
. Escolha o seu veneno.Na versão 0.24. + Os pandas ganharam a capacidade de armazenar tipos inteiros com valores ausentes.
Tipo de Dados Inteiro Anulável .
Pandas podem representar dados inteiros com possivelmente valores ausentes usando
arrays.IntegerArray
. Este é um tipo de extensão implementado no pandas. Não é o tipo padrão para números inteiros e não será inferido; você deve passar explicitamente o dtype paraarray()
ouSeries
:Para converter a coluna em números inteiros anuláveis, use:
fonte
"Int64"
e não"int64"
(primeiro 'i' deve ser capitalizado)df.myCol = df.myCol.astype('Int64')
oudf['myCol'] = df['myCol'].astype('Int64')
Meu caso de uso está filtrando dados antes do carregamento em uma tabela do banco de dados:
Remova NaNs, converta para int, converta para str e, em seguida, reinsira NANs.
Não é bonito, mas faz o trabalho!
fonte
Agora é possível criar uma coluna de pandas contendo NaNs como dtype
int
, já que agora é adicionada oficialmente ao pandas 0.24.0Notas da versão do pandas 0.24.x Quote: "O Pandas ganhou a capacidade de armazenar tipos inteiros com valores ausentes
fonte
Se você absolutamente deseja combinar números inteiros e NaNs em uma coluna, pode usar o tipo de dados 'objeto':
Isso substituirá os NaNs por um número inteiro (não importa qual), converter para int, converter para objeto e finalmente reinserir NaNs.
fonte
Se você pode modificar os dados armazenados, use um valor sentinela como ausente
id
. Um caso de uso comum, inferido pelo nome da coluna, sendoid
um número inteiro, estritamente maior que zero, você pode usar0
como um valor sentinela para poder escreverfonte
Você pode usar
.dropna()
se estiver OK descartar as linhas com os valores de NaN.Como alternativa, use
.fillna()
e.astype()
para substituir o NaN por valores e convertê-los em int.Corri para esse problema ao processar um arquivo CSV com números inteiros grandes, enquanto alguns deles estavam ausentes (NaN). Usar float como o tipo não era uma opção, porque eu poderia perder a precisão.
Minha solução foi usar str como o tipo intermediário . Em seguida, você pode converter a string para int como desejar posteriormente no código. Substituí NaN por 0, mas você pode escolher qualquer valor.
Para a ilustração, aqui está um exemplo de como os flutuadores podem perder a precisão:
E a saída é:
fonte
A maioria das soluções aqui mostra como usar um número inteiro de espaço reservado para representar nulos. Essa abordagem não é útil se você não tiver certeza de que o número inteiro não será exibido nos dados de origem. Meu método com irá formatar carros alegóricos sem seus valores decimais e converter nulos em nenhum. O resultado é um tipo de dados do objeto que se parecerá com um campo inteiro com valores nulos quando carregado em um CSV.
fonte
Encontrei este problema ao trabalhar com o pyspark. Como este é um front-end python para código em execução em uma jvm, requer segurança de tipo e o uso de float em vez de int não é uma opção. Eu resolvi o problema envolvendo os pandas
pd.read_csv
em uma função que preencherá as colunas definidas pelo usuário com valores de preenchimento definidos pelo usuário antes de convertê-los no tipo necessário. Aqui está o que eu acabei usando:fonte
fonte
edit
adicionar informações adicionais e / ou complementar suas explicações com a documentação de origem.Primeiro remova as linhas que contêm NaN. Em seguida, faça a conversão de número inteiro nas linhas restantes. Por último, insira as linhas removidas novamente. Espero que funcione
fonte
Supondo que o DateColumn formatado 3312018.0 deve ser convertido para 31/03/2018 como uma sequência. E, alguns registros estão ausentes ou 0.
fonte