Respuestas:
ACTUALIZACIÓN: usando Pandas 0.22.0
Las versiones más recientes de Pandas tienen nuevos métodos 'DataFrame.isna ()' y '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 columnas:
In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']
para seleccionar esas columnas (que contienen al menos un 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
ANTIGUA respuesta:
Intenta 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
o como @root propuso una versión más 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 seleccionar un subconjunto: todas las columnas que contienen al menos un 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
?
Tuve un problema en el que tenía que inspeccionar visualmente muchas columnas en la pantalla, por lo que una breve lista de compilación que filtra y devuelve las columnas ofensivas es
nan_cols = [i for i in df.columns if df[i].isnull().any()]
si eso es útil para alguien
En los conjuntos de datos que tienen una gran cantidad de columnas, es aún mejor ver cuántas columnas contienen valores nulos y cuántas no.
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 ejemplo, en mi marco de datos contenía 82 columnas, de las cuales 19 contenían al menos un valor nulo.
Además, también puede eliminar automáticamente columnas y filas según cuál tenga valores más nulos.
Aquí está el código que hace esto de manera inteligente:
df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)
Nota: el código anterior elimina todos sus valores nulos. Si desea valores nulos, procéselos antes.
Esto funcionó para mí
1. Para obtener columnas que tengan al menos 1 valor nulo. (nombres de columna)
data.columns[data.isnull().any()]
2. Para obtener columnas con conteo, con al menos 1 valor nulo.
data[data.columns[data.isnull().any()]].isnull().sum()
[Opcional] 3. Para obtener el porcentaje del recuento nulo.
data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
df.isna().any()[lambda x: x]
funciona para mí