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?
13 respuestas
No deje caer, solo tome las filas donde EPS no es NA:
df = df[df['EPS'].notna()]
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
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
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.
Otra version:
df[~df['EPS'].isna()]
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.
Manera simple y fácil
df.dropna(subset=['EPS'],inplace=True)
Fuente: https://pandas.pydata.org/pandas -docs / stable / generate / pandas.DataFrame.dropna.html
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]
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!
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 ()
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'])]
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.
Puede utilizar esto:
df.dropna(subset=['EPS'], how='all', inplace=True)
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.