J'ai cette DataFrame
et je ne veux que les enregistrements dont la colonne EPS
n'est pas 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
...c'est à dire. quelque chose comme df.drop(....)
pour obtenir ce dataframe résultant:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
Comment je fais ça?
Ne pas drop
. Il suffit de prendre des lignes où EPS
est fini:
import numpy as np
df = df[np.isfinite(df['EPS'])]
Cette question est déjà résolue, mais ...
... considérons également la solution suggérée par Wouter dans son commentaire original . La possibilité de gérer les données manquantes, y compris dropna()
, est explicitement intégrée à pandas. Outre les performances potentiellement améliorées par rapport à l'exécution manuelle, ces fonctions offrent également une variété d'options qui peuvent être utiles.
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
Il existe également d'autres options (voir docs à l'adresse http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html ), notamment la suppression de colonnes au lieu de lignes.
Très pratique!
Je sais que cela a déjà été répondu, mais juste pour une solution purement pandas] à cette question spécifique, par opposition à la description générale de Aman (qui était magnifique) et au cas où quelqu'un d'autre en arriverait là:
import pandas as pd
df = df[pd.notnull(df['EPS'])]
Vous pouvez utiliser ceci:
df.dropna(subset=['EPS'], how='all', inplace = True)
La plus simple de toutes les solutions:
filtered_df = df[df['EPS'].notnull()]
La solution ci-dessus est bien meilleure que d'utiliser np.isfinite ()
Vous pouvez utiliser la méthode dataframe notnull ou l'inverse de isnull , ou 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
vous pouvez utiliser dropna
Exemple
Supprimez les lignes où au moins un élément est manquant.
df=df.dropna()
Définissez les colonnes dans lesquelles rechercher les valeurs manquantes.
df=df.dropna(subset=['column1', 'column1'])
Voir this pour plus d'exemples
Remarque: le paramètre d'axe de dropna est obsolète depuis la version 0.23.0:
encore une autre solution qui utilise le fait 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
Ou (recherchez les NaN avec isnull
, puis utilisez ~
pour faire l'inverse de l'absence de NaN):
df=df[~df['EPS'].isnull()]
Maintenant:
print(df)
Est:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
Moyen simple et facile
df.dropna(subset=['EPS'],inplace=True)
source: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
Cette réponse est beaucoup plus simple que tout ce qui précède :)
df=df[df['EPS'].notnull()]
Il peut être ajouté en tant que "&" peut être utilisé pour ajouter des conditions supplémentaires, par ex.
df = df[(df.EPS > 2.0) & (df.EPS <4.0)]
Notez que lors de l'évaluation des déclarations, pandas a besoin d'une parenthèse.
Pour une raison quelconque, aucune des réponses précédemment soumises ne fonctionnait pour moi. Cette solution de base a:
df = df[df.EPS >= 0]
Bien sûr, cela supprimera également les lignes avec des nombres négatifs. Donc, si vous les souhaitez, il est probablement judicieux d’ajouter ceci après.
df = df[df.EPS <= 0]