tablas - Cómo encontrar qué columnas contienen cualquier valor de NaN en el marco de datos de Pandas(python)
filtrar datos pandas (5)
Ambos deberían funcionar:
nan_cols = [i for i in df.columns if df[i].isnull().any()]
Los métodos
isna()
o
isnull()
son completamente idénticos.
Nota
: Cadenas vacías
''''
se considera falso (no se considera NA)
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?
Puede usar
df.isnull().sum()
.
Muestra todas las columnas y los NaN totales de cada característica.
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
df.isnull().sum()
df.isna().sum()
si eso es útil para alguien
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()))
ACTUALIZACIÓN: utilizando 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 valor
NaN
):
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 valor
NaN
:
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