Respostas:
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 NaN
valor):
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 NaN
valor:
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
df.columns[df.isin['xxx'].any()].tolist()
df.columns[df.eq(search_for_value).any()].tolist()
isna
, notna
?
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
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.
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]
df.isna().any()[lambda x: x]
trabalha para mim