Je développerai la solution générique de @ User pour fournir un drop
alternative gratuite. Ceci est pour les personnes dirigées ici en fonction du titre de la question (pas le problème d'OP)
Supposons que vous souhaitiez supprimer toutes les lignes contenant des valeurs négatives. Une solution de revêtement est: -
df = df[(df > 0).all(axis=1)]
Explication étape par étape: -
Générons une trame de données de distribution normale aléatoire 5x5
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
Que la condition supprime les négatifs. Un booléen df satisfaisant la condition: -
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
Une série booléenne pour toutes les lignes remplissant la condition Remarque si un élément de la ligne échoue, la ligne est marquée comme fausse
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Enfin, filtrez les lignes du bloc de données en fonction de la condition
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
Vous pouvez attribuer revenir à df de réellement supprimer vs filtre ing fait ci - dessus
df = df[(df > 0).all(axis=1)]
Cela peut facilement être étendu pour filtrer les lignes contenant des NaN (entrées non numériques): -
df = df[(~df.isnull()).all(axis=1)]
Cela peut également être simplifié pour des cas comme: Supprimer toutes les lignes où la colonne E est négative
df = df[(df.E>0)]
Je voudrais terminer avec quelques statistiques de profilage expliquant pourquoi la drop
solution @ User est plus lente que la filtration basée sur des colonnes brutes: -
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Une colonne est essentiellement un à- Series
dire un NumPy
tableau, il peut être indexé sans frais. Pour les personnes intéressées par la façon dont l'organisation de la mémoire sous-jacente joue dans la vitesse d'exécution, voici un excellent lien sur l'accélération des pandas :
df[[(len(x) < 2) for x in df['column name']]]
mais la vôtre est beaucoup plus agréable. Merci de votre aide!