python - tablas - seleccionar filas pandas
Cómo eliminar filas de Pandas DataFrame cuyo valor en ciertas columnas es NaN (11)
Esta pregunta ya está resuelta, pero ...
... también considere la solución sugerida por Wouter en su comentario original . La capacidad de manejar los datos faltantes, incluido dropna()
, está integrada explícitamente en pandas. Aparte de un rendimiento potencialmente mejor que 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 pandas.pydata.org/pandas-docs/stable/generated/… ), incluida la eliminación de columnas en lugar de filas.
¡Muy útil!
Tengo un DataFrame
:
>>> 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
Entonces solo quiero los registros cuyo EPS
no es NaN
, es decir, df.drop(....)
devolverá el marco de datos como se muestra a continuación:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
¿Cómo puedo hacer eso?
No dejes drop
Solo toma filas donde EPS
es finito :
df = df[np.isfinite(df[''EPS''])]
O (compruebe si hay NaN con isnull
, luego use ~
para hacer lo contrario a no NaN):
df=df[~df[''EPS''].isnull()]
Ahora:
print(df)
Es:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
Podría usar el método 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
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 sea inteligente agregar esto también después.
df = df[df.EPS <= 0]
Puedes usar esto:
df.dropna(subset=[''EPS''], how=''all'', inplace = True)
Sé que esto ya ha sido respondido, pero solo por una solución puramente pandas a esta pregunta específica en contraposición a la descripción general de Aman (que fue maravillosa) y en caso de que alguien más lo descubra:
import pandas as pd
df = df[pd.notnull(df[''EPS''])]
Se puede agregar a la que se puede usar ''&'' para agregar condiciones adicionales, por ejemplo,
df = df[(df.EPS > 2.0) & (df.EPS <4.0)]
Tenga en cuenta que al evaluar las declaraciones, los pandas necesitan paréntesis.
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
puedes usar pandas.pydata.org/pandas-docs/stable/generated/…
Ejemplo
Suelte las filas donde falta al menos un elemento.
df=df.dropna()
Definir en qué columnas buscar valores faltantes.
df=df.dropna(subset=[''column1'', ''column1''])
Vea this para más ejemplos
Nota: el parámetro axis de dropna está en desuso desde la versión 0.23.0:
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 ()