Expandiré la solución genérica de @ User para proporcionar una drop
alternativa gratuita. Esto es para las personas que se dirigen aquí según el título de la pregunta (no el problema de OP)
Digamos que desea eliminar todas las filas con valores negativos. Una solución de revestimiento es: -
df = df[(df > 0).all(axis=1)]
Paso a paso Explicación: -
Generemos un marco de datos de distribución normal aleatorio de 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
Deje que la condición elimine negativos. Un df booleano que satisface la condición: -
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 para todas las filas que satisfacen la condición Tenga en cuenta que si algún elemento de la fila falla la condición, la fila se marca como falsa
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Finalmente, filtre las filas del marco de datos según la condición
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
Puede asignarlo de nuevo a df para eliminar realmente vs filtrar hecho anteriormente
df = df[(df > 0).all(axis=1)]
Esto se puede ampliar fácilmente para filtrar las filas que contienen NaN s (entradas no numéricas):
df = df[(~df.isnull()).all(axis=1)]
Esto también se puede simplificar para casos como: Eliminar todas las filas donde la columna E es negativa
df = df[(df.E>0)]
Me gustaría terminar con algunas estadísticas de perfiles sobre por qué la drop
solución de @ User es más lenta que la filtración basada en columnas sin procesar: -
%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 columna es básicamente una matriz, Series
es decir NumPy
, puede indexarse sin costo alguno. Para las personas interesadas en cómo la organización de la memoria subyacente juega con la velocidad de ejecución, aquí hay un gran enlace para acelerar los pandas :
df[[(len(x) < 2) for x in df['column name']]]
pero la tuya es mucho más agradable. ¡Gracias por tu ayuda!