Como descobrir quais colunas contêm qualquer valor de NaN no quadro de dados do Pandas

144

Dado um quadro de dados de pandas contendo possíveis valores de NaN espalhados aqui e ali:

Pergunta: Como determino quais colunas contêm valores de NaN? Em particular, posso obter uma lista dos nomes de colunas que contêm NaNs?

denvar
fonte
5
df.isna().any()[lambda x: x]trabalha para mim
matanster

Respostas:

249

ATUALIZAÇÃO: usando o Pandas 0.22.0

As versões mais recentes do Pandas têm novos métodos 'DataFrame.isna ()' e 'DataFrame.notna ()'

In [71]: df
Out[71]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

como lista de colunas:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

para selecionar essas colunas (contendo pelo menos um NaNvalor):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

Resposta ANTIGA:

Tente usar isnull () :

In [97]: df
Out[97]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

ou como a @root propôs uma versão mais clara:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool

In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

para selecionar um subconjunto - todas as colunas contendo pelo menos um NaNvalor:

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0
MaxU
fonte
Obrigado pela resposta! Estou procurando obter uma lista dos nomes das colunas (atualizei minha pergunta de acordo), sabe como?
Denegr 25/03/16
Você conhece uma boa maneira de selecionar todas as colunas com um valor específico em vez de valores nulos?
precisa
1
Deixa pra lá! Simplesmente substitua .isnull () por .isin (['xxx']) para procurar valores em vez de nulos:df.columns[df.isin['xxx'].any()].tolist()
gregorio099
@ gregorio099, eu faria assim:df.columns[df.eq(search_for_value).any()].tolist()
MaxU 22/10
1
Boa resposta, já votada. Idea - você pode adicionar novas funções isna, notna ?
Jezrael
26

Você pode usar df.isnull().sum(). Ele mostra todas as colunas e o total de NaNs de cada recurso.

Matheus
fonte
9

Eu tive um problema em que precisei de muitas colunas para inspecionar visualmente na tela, de modo que uma pequena lista de componentes que filtra e retorna as colunas incorretas é

nan_cols = [i for i in df.columns if df[i].isnull().any()]

se isso é útil para alguém

Tom Wattley
fonte
4

Em conjuntos de dados com grande número de colunas, é ainda melhor ver quantas colunas contêm valores nulos e quantas não.

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

Por exemplo, no meu dataframe, ele continha 82 colunas, das quais 19 continham pelo menos um valor nulo.

Além disso, você também pode remover automaticamente colunas e linhas, dependendo de quais possuem mais valores nulos.
Aqui está o código que faz isso de forma inteligente:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

Nota: O código acima remove todos os seus valores nulos. Se você deseja valores nulos, processe-os antes.

Pradeep Singh
fonte
2

Eu uso essas três linhas de código para imprimir os nomes das colunas que contêm pelo menos um valor nulo:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))
Frank
fonte
2

Ambos devem funcionar:

df.isnull().sum()
df.isna().sum()

Métodos DataFrame isna()ou isnull()são completamente idênticos.

Nota : Seqüências de caracteres vazias ''são consideradas falsas (não consideradas NA)

prosti
fonte
1

Isso funcionou para mim,

1. Para obter colunas com pelo menos 1 valor nulo. (nomes de colunas)

data.columns[data.isnull().any()]

2. Para obter colunas com contagem, com pelo menos 1 valor nulo.

data[data.columns[data.isnull().any()]].isnull().sum()

[Opcional] 3. Para obter a porcentagem da contagem nula.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Uday Kiran
fonte
Obrigado pelas várias abordagens!
Mike Rapadas