No Python Pandas, qual é a melhor maneira de verificar se um DataFrame possui um (ou mais) valores NaN?
Eu sei sobre a função pd.isnan
, mas isso retorna um DataFrame de booleanos para cada elemento. Este post aqui também não responde exatamente à minha pergunta.
Respostas:
A resposta de jwilner é imediata . Eu estava explorando para ver se havia uma opção mais rápida, pois, na minha experiência, a soma de matrizes simples é (estranhamente) mais rápida que a contagem. Este código parece mais rápido:
Por exemplo:
df.isnull().sum().sum()
é um pouco mais lento, mas é claro, tem informações adicionais - o número deNaNs
.fonte
pandas
não tenha uma função integrada para isso. É verdade no post de @ JGreenwell quedf.describe()
pode fazer isso, mas nenhuma função direta.df.describe()
(sem encontrarNaN
s). Com uma matriz de 1000 x 1000, uma única chamada leva 1,15 segundos.df.isnull().values.sum()
é um pouco mais rápido quedf.isnull().values.flatten().sum()
.flatten()
cópia. Obrigado.df.isnull().values.any()
, para mim é mais rápido que os outros.Você tem algumas opções.
Agora, o quadro de dados se parece com isso:
df.isnull().any().any()
- Isso retorna um valor booleanoVocê sabe o
isnull()
que retornaria um quadro de dados como este:Se você fizer isso
df.isnull().any()
, poderá encontrar apenas as colunas que possuemNaN
valores:Mais um
.any()
lhe dirá se alguma das opções acima éTrue
df.isnull().sum().sum()
- Isso retorna um número inteiro do número total deNaN
valores:Isso funciona da mesma maneira que o
.any().any()
faz, fornecendo primeiro um somatório do número deNaN
valores em uma coluna e depois o somatório desses valores:Por fim, para obter o número total de valores de NaN no DataFrame:
fonte
.any(axis=None)
vez de.any().any()
?Para descobrir quais linhas têm NaNs em uma coluna específica:
fonte
non_nan_rows = df[df['name column'].notnull()]
.Se você precisar saber quantas linhas existem com "um ou mais
NaN
s":Ou se você precisar extrair essas linhas e examiná-las:
fonte
df.isnull().any().any()
deve fazê-lo.fonte
Acrescentando à resposta brilhante do Hobs, sou muito novo no Python e no Pandas, portanto, aponte se estou errado.
Para descobrir quais linhas têm NaNs:
executaria a mesma operação sem a necessidade de transposição especificando o eixo de any () como 1 para verificar se 'True' está presente nas linhas.
fonte
any(axis=1)
simplificação concisa .Sintaxe super simples:
df.isna().any(axis=None)
A partir da v0.23.2 , você pode usar
DataFrame.isna
+DataFrame.any(axis=None)
ondeaxis=None
especifica a redução lógica em todo o DataFrame.Alternativas úteis
numpy.isnan
Outra opção de desempenho se você estiver executando versões mais antigas de pandas.
Como alternativa, verifique a soma:
Series.hasnans
Você também pode ligar iterativamente
Series.hasnans
. Por exemplo, para verificar se uma única coluna possui NaNs,E para verificar se alguma coluna possui NaNs, você pode usar uma compreensão com
any
(que é uma operação em curto-circuito).Isso é realmente muito rápido.
fonte
Como nenhum deles mencionou, existe apenas outra variável chamada
hasnans
.df[i].hasnans
será exibidoTrue
se um ou mais dos valores da série pandas for NaN,False
se não. Note que não é uma função.versão pandas '0.19.2' e '0.20.2'
fonte
df = DataFrame([1,None], columns=['foo'])
, entãodf.hasnans
lançará umAttributeError
, masdf.foo.hasnans
retornaráTrue
.Como ele
pandas
tem que descobrir issoDataFrame.dropna()
, dei uma olhada para ver como eles o implementam e descobri que eles utilizavamDataFrame.count()
, o que conta todos os valores não nulos noDataFrame
. Cf. código fonte do pandas . Não avaliei essa técnica, mas acho que os autores da biblioteca provavelmente fizeram uma escolha sábia de como fazê-lo.fonte
deixe
df
ser o nome do Pandas trama de dados e qualquer valor que énumpy.nan
é um valor nulo.Se você deseja ver a porcentagem de nulos em todas as colunas
df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100
EDIT 1:
Se você deseja ver onde seus dados estão ausentes visualmente:
fonte
df.isna().sum()
?Apenas usando math.isnan (x) , Return True se x for um NaN (não um número) e False caso contrário.
fonte
math.isnan(x)
vai funcionar quandox
é um DataFrame. Você recebe um TypeError.Isso fornecerá a contagem de todos os valores de NaN presentes nos respectivos volumes do DataFrame.
fonte
Aqui está outra maneira interessante de encontrar nulo e substituir por um valor calculado
fonte
Eu tenho usado o seguinte e digite convertê-lo em uma seqüência de caracteres e verificando o valor nan
Isso me permite verificar o valor específico de uma série e não apenas retornar se isso estiver contido em algum lugar da série.
fonte
pandas.isna()
?O melhor seria usar:
Aqui está o porquê . Então,
isna()
é usado para definirisnull()
, mas ambos são idênticos, é claro.Isso é ainda mais rápido que a resposta aceita e abrange todas as matrizes 2D de panda.
fonte
Ou você pode usar
.info()
noDF
tais como:df.info(null_counts=True)
que retorna o número de linhas não-nulas em colunas como:fonte
fonte
Irá verificar se cada coluna contém Nan ou não.
fonte
Podemos ver os valores nulos presentes no conjunto de dados, gerando um mapa de calor usando o mapa de calor do módulo marítimo
fonte
Você não apenas pode verificar se existe algum 'NaN', mas também obter a porcentagem de 'NaNs em cada coluna usando o seguinte,
fonte
Dependendo do tipo de dados com o qual você está lidando, você também pode obter as contagens de valores de cada coluna enquanto executa sua EDA configurando dropna como False.
Funciona bem para variáveis categóricas, não tanto quando você tem muitos valores exclusivos.
fonte