Estou lendo duas colunas de um arquivo csv usando o pandas readcsv()
e, em seguida, atribuindo os valores a um dicionário. As colunas contêm sequências de números e letras. Ocasionalmente, há casos em que uma célula está vazia. Em minha opinião, o valor lido para essa entrada do dicionário deveria ser, None
mas em vez disso nan
é atribuído. Certamente None
é mais descritivo de uma célula vazia, pois tem um valor nulo, enquanto nan
apenas diz que o valor lido não é um número.
O meu entendimento está correto, qual é a diferença entre None
e nan
? Por que é nan
atribuído em vez de None
?
Além disso, minha verificação de dicionário para quaisquer células vazias tem usado numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Mas isso me dá um erro dizendo que não posso usar esse cheque para v
. Eu acho que é porque uma variável inteira ou flutuante, não uma string, deve ser usada. Se isso for verdade, como posso verificar se v
há uma "célula vazia" / nan
caso?
qwerty
não é um número.None
seria uma descrição melhor do valor de uma célula vazia.Respostas:
NaN é usado como um espaço reservado para dados ausentes de forma consistente em pandas , a consistência é boa. Eu geralmente leio / traduzo NaN como "ausente" . Consulte também a seção 'trabalhando com dados ausentes' nos documentos.
Wes escreve nos documentos 'escolha da representação de NA' :
Nota: o "pegadinho" de que Séries inteiras contendo dados ausentes são convertidas em flutuantes .
Na minha opinião, a principal razão para usar NaN (em vez de None) é que ele pode ser armazenado com o dtype float64 de numpy, em vez do dtype de objeto menos eficiente, consulte as promoções de tipo NA .
Jeff comenta (abaixo) sobre isso:
Dizendo isso, muitas operações ainda podem funcionar tão bem com None vs NaN (mas talvez não sejam suportadas, ou seja, às vezes podem dar resultados surpreendentes ):
Para responder à segunda pergunta:
Você deve estar usando
pd.isnull
epd.notnull
para testar se há dados ausentes (NaN).fonte
np.nan
permite operações vetorizadas; é um valor flutuante, enquantoNone
por definição força oobject
tipo e basicamente desativa toda a eficiência em numpy, então repita 3 vezes rápido:object==bad, float==good
<NA>
Também é umnp.nan
?NaN
pode ser usado como um valor numérico em operações matemáticas, enquantoNone
não pode (ou pelo menos não deveria).NaN
é um valor numérico, conforme definido no padrão de ponto flutuante IEEE 754 .None
é um tipo interno do Python (NoneType
) e seria mais "inexistente" ou "vazio" do que "numericamente inválido" neste contexto.O principal "sintoma" disso é que, se você executar, digamos, uma média ou uma soma em uma matriz contendo NaN, mesmo que seja um único, você obtém NaN como resultado ...
Por outro lado, você não pode realizar operações matemáticas usando
None
como operando.Então, dependendo do caso, você pode usar
None
como uma forma de dizer ao seu algoritmo para não considerar valores inválidos ou inexistentes nos cálculos. Isso significa que o algoritmo deve testar cada valor para ver se éNone
.Numpy tem algumas funções para evitar que valores NaN contaminem seus resultados, como
nansum
enan_to_num
por exemplo.fonte
df=pd.readcsv('file.csv')
me dáNaN
valores para as células vazias e nãoNone
? Pelo que eu sei, pd.DataFrames não são exclusivos para números.dtype
, portanto, valores inválidos dedtype=float
devem ser representados por valores numéricos, queNaN
é eNone
nãoNone
é ( é deNoneType
).na
argumento, que permite que você decida qual valor usará para substituir os valores não disponíveisA função
isnan()
verifica se algo é "Não é um número" e retornará se uma variável é ou não um número, por exemploisnan(2)
, retornaria falsoO condicional
myVar is not None
retorna independentemente de a variável estar ou não definidaSeu numpy array usa
isnan()
porque se destina a ser um array de números e inicializa todos os elementos do array para queNaN
esses elementos sejam considerados "vazios"fonte
isnan(2)
que voltariaFalse
, já que 2 não é um NaN.numpy.empty
não inicializa valores de array paraNaN
. Ele simplesmente não inicializa os valores.None
-ness émyVar is not None
, nãomyVar != None
.np.isnan()
não é implementado para variáveis de string, então se você passar uma string, ele irá travar. Melhor usar opd.isnull
que funciona com cordas.Abaixo estão as diferenças:
nan
pertence à classefloat
None
pertence à classeNoneType
Achei o artigo abaixo muito útil: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
fonte
NaN
stants para NÃO um número .None
pode significar qualquer .fonte