Pregunta Pandas de Python Filtrando nan de una selección de datos de una columna de cadenas


Sin uso groupby ¿Cómo puedo filtrar los datos sin NaN?

Supongamos que tengo una matriz donde los clientes rellenarán 'N / A', 'n / a' o cualquiera de sus variaciones y otros la dejarán en blanco:

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

salida:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

¿Cómo puedo filtrar los valores NaN para que pueda obtener resultados con los que trabajar así?

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

Supongo que necesito algo como ~np.isnan pero la tilda no funciona con cadenas.


73
2018-03-21 06:04


origen


Respuestas:


Simplemente colóquelos:

nms.dropna(thresh=2)

esto soltará todas las filas donde haya al menos dosNaN

entonces podrías soltar donde está el nombre NaN:

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

EDITAR

En realidad, mirando lo que originalmente quieres, puedes hacer esto sin el dropna llamada:

nms[nms.name.notnull()]

ACTUALIZAR

Viendo esta pregunta 3 años después, hay un error, en primer lugar thresh arg busca al menos n no-NaN valores por lo que, de hecho, la salida debe ser:

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

Es posible que me equivocaran hace 3 años o que la versión de pandas que estaba ejecutando tuviera un error, ambos escenarios son completamente posibles


121
2018-03-21 08:33



La más simple de todas las soluciones:

filtered_df = df[df['name'].notnull()]

Por lo tanto, filtra solo las filas que no tienen valores NaN en la columna 'nombre'.


58
2017-12-04 08:38