Espanderò sulla soluzione generica di @ User per fornire drop
un'alternativa gratuita. Questo è per le persone dirette qui in base al titolo della domanda (non al problema di OP)
Supponi di voler eliminare tutte le righe con valori negativi. Una soluzione di rivestimento è: -
df = df[(df > 0).all(axis=1)]
Spiegazione dettagliata: -
Generiamo un frame di dati di distribuzione normale casuale 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
Lascia che la condizione elimini i negativi. Un booleano df che soddisfa la condizione: -
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
Una serie booleana per tutte le righe che soddisfano la condizione Nota se qualsiasi elemento nella riga non riesce la condizione la riga è contrassegnata come falsa
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Infine filtra le righe dal frame di dati in base alla condizione
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
È possibile assegnare di nuovo a df effettivamente eliminare vs filtro ing fatto sopra
df = df[(df > 0).all(axis=1)]
Questo può essere facilmente esteso per filtrare le righe contenenti NaN (voci non numeriche): -
df = df[(~df.isnull()).all(axis=1)]
Questo può anche essere semplificato per casi come: Elimina tutte le righe in cui la colonna E è negativa
df = df[(df.E>0)]
Vorrei concludere con alcune statistiche di profilazione sul perché la drop
soluzione di @ User è più lenta della filtrazione basata su colonne non elaborate: -
%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)
Una colonna è fondamentalmente un Series
esempio una NumPy
matrice, può essere indicizzato senza alcun costo. Per le persone interessate a come l'organizzazione della memoria sottostante gioca nella velocità di esecuzione ecco un ottimo collegamento su Speeding up Panda :
df[[(len(x) < 2) for x in df['column name']]]
ma la tua è molto più bella. Grazie per l'aiuto!