Cómo encontrar qué columnas contienen cualquier valor de NaN en el marco de datos de Pandas

144

Dado un marco de datos de pandas que contiene posibles valores de NaN dispersos aquí y allá:

Pregunta: ¿Cómo determino qué columnas contienen valores de NaN? En particular, ¿puedo obtener una lista de los nombres de columna que contienen NaN?

denvar
fuente
55
df.isna().any()[lambda x: x]funciona para mí
matanster

Respuestas:

249

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 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

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 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
fuente
¡Gracias por la respuesta! Estoy buscando obtener una lista de los nombres de columna (actualicé mi pregunta en consecuencia), ¿sabes cómo?
denvar
¿Conoce una buena manera de seleccionar todas las columnas con un valor específico en lugar de valores nulos?
gregorio099
1
¡No importa! Simplemente reemplace .isnull () con .isin (['xxx']) para buscar valores en lugar de nulos:df.columns[df.isin['xxx'].any()].tolist()
gregorio099
@ gregorio099, lo haría de esta manera: df.columns[df.eq(search_for_value).any()].tolist()
MaxU
1
Buena respuesta, ya votada. Idea: ¿puedes agregar nuevas funciones isna,notna ?
Jezrael,
26

Puedes usar df.isnull().sum(). Muestra todas las columnas y los NaN totales de cada característica.

Matheus
fuente
9

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

Tom Wattley
fuente
4

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.

Pradeep Singh
fuente
2

Utilizo estas tres líneas de código para imprimir los nombres de columna que contienen al menos un valor nulo:

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

Ambos deberían funcionar:

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

Los métodos DataFrame isna()o isnull()son completamente idénticos.

Nota : Las cadenas vacías ''se consideran falsas (no se consideran NA)

prosti
fuente
1

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]
Uday Kiran
fuente
¡Gracias por los múltiples enfoques!
Mike Rapadas