Tengo esto DataFrame y quiero solo los registros cuya columna EPS no sea NaN:

>>> df
                 STK_ID  EPS  cash
STK_ID RPT_Date                   
601166 20111231  601166  NaN   NaN
600036 20111231  600036  NaN    12
600016 20111231  600016  4.3   NaN
601009 20111231  601009  NaN   NaN
601939 20111231  601939  2.5   NaN
000001 20111231  000001  NaN   NaN

...es decir. algo así como df.drop(....) para obtener este marco de datos resultante:

                  STK_ID  EPS  cash
STK_ID RPT_Date                   
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN

¿Cómo lo hago?

700
bigbug 16 nov. 2012 a las 13:17

13 respuestas

La mejor respuesta

No deje caer, solo tome las filas donde EPS no es NA:

df = df[df['EPS'].notna()]
557
AMC 16 feb. 2020 a las 07:46

Otra solución más que utiliza el hecho de que np.nan != np.nan:

In [149]: df.query("EPS == EPS")
Out[149]:
                 STK_ID  EPS  cash
STK_ID RPT_Date
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN
10
MaxU 20 abr. 2017 a las 21:15

Puede usar el método de marco de datos notnull o inverso de isnull, o numpy.isnan:

In [332]: df[df.EPS.notnull()]
Out[332]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [334]: df[~df.EPS.isnull()]
Out[334]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [347]: df[~np.isnan(df.EPS)]
Out[347]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN
21
Anton Protopopov 4 dic. 2015 a las 07:01

Se puede agregar en ese '&' se puede usar para agregar condiciones adicionales, p.

df = df[(df.EPS > 2.0) & (df.EPS <4.0)]

Tenga en cuenta que al evaluar las declaraciones, los pandas necesitan paréntesis.

0
aesede 26 ene. 2017 a las 23:12

Otra version:

df[~df['EPS'].isna()]
1
Georgy 10 feb. 2020 a las 09:19

Una de las soluciones puede ser

df = df[df.isnull().sum(axis=1) <= Cutoff Value]

Otra forma puede ser

df= df.dropna(thresh=(df.shape[1] - Cutoff_value))

Espero que sean útiles.

-1
Amit Gupta 23 sep. 2019 a las 11:00

Manera simple y fácil

df.dropna(subset=['EPS'],inplace=True)

Fuente: https://pandas.pydata.org/pandas -docs / stable / generate / pandas.DataFrame.dropna.html

16
Nursnaaz 23 ene. 2019 a las 10:13

Por alguna razón, ninguna de las respuestas enviadas anteriormente funcionó para mí. Esta solución básica hizo:

df = df[df.EPS >= 0]

Aunque, por supuesto, eso también eliminará filas con números negativos. Entonces, si quieres esos, probablemente también sea inteligente agregar esto después.

df = df[df.EPS <= 0]
-1
samthebrand 9 oct. 2015 a las 18:25

Esta pregunta ya está resuelta, pero ...

... también considere la solución sugerida por Wouter en su comentario original. La capacidad de manejar datos faltantes, incluidos dropna(), está integrada explícitamente en los pandas. Además de un rendimiento potencialmente mejorado sobre hacerlo manualmente, estas funciones también vienen con una variedad de opciones que pueden ser útiles.

In [24]: df = pd.DataFrame(np.random.randn(10,3))

In [25]: df.iloc[::2,0] = np.nan; df.iloc[::4,1] = np.nan; df.iloc[::3,2] = np.nan;

In [26]: df
Out[26]:
          0         1         2
0       NaN       NaN       NaN
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [27]: df.dropna()     #drop all rows that have any NaN values
Out[27]:
          0         1         2
1  2.677677 -1.466923 -0.750366
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295

In [28]: df.dropna(how='all')     #drop only if ALL columns are NaN
Out[28]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [29]: df.dropna(thresh=2)   #Drop row if it does not have at least two values that are **not** NaN
Out[29]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

In [30]: df.dropna(subset=[1])   #Drop only if NaN in specific column (as asked in the question)
Out[30]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

También hay otras opciones (consulte los documentos en http: // pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html), incluida la caída de columnas en lugar de filas.

Bastante práctica!

869
ayhan 14 ago. 2017 a las 00:04

La más simple de todas las soluciones:

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

La solución anterior es mucho mejor que usar np.isfinite ()

34
ayhan 8 ago. 2018 a las 15:17

Sé que esto ya ha sido respondido, pero solo por el bien de una solución puramente panda a esta pregunta específica en oposición a la descripción general de Aman (que fue maravilloso) y en caso de que alguien más ocurra esto:

import pandas as pd
df = df[pd.notnull(df['EPS'])]
120
Kirk Hadley 23 abr. 2014 a las 05:37

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 más valores 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.

1
Pradeep Singh 17 feb. 2020 a las 11:00

Puede utilizar esto:

df.dropna(subset=['EPS'], how='all', inplace=True)
53
Georgy 22 oct. 2019 a las 08:04
13413590