Expandirei a solução genérica do @ User para fornecer uma drop
alternativa gratuita. Isto é para pessoas direcionadas aqui com base no título da pergunta (não no problema do OP)
Digamos que você queira excluir todas as linhas com valores negativos. Uma solução de revestimento é: -
df = df[(df > 0).all(axis=1)]
Explicação passo a passo: -
Vamos gerar um quadro de dados de distribuição normal aleatória 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
Deixe a condição excluir negativos. Um DF booleano que satisfaça a condição: -
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
Uma série booleana para todas as linhas que satisfazem a condição Observe que, se algum elemento da linha falhar, a condição é marcada como falsa
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Por fim, filtre as linhas do quadro de dados com base na condição
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
Você pode atribuí-lo novamente ao df para realmente excluir vs filtragem feita acima
df = df[(df > 0).all(axis=1)]
Isso pode ser facilmente estendido para filtrar linhas contendo NaN s (entradas não numéricas): -
df = df[(~df.isnull()).all(axis=1)]
Isso também pode ser simplificado para casos como: Exclua todas as linhas em que a coluna E é negativa
df = df[(df.E>0)]
Gostaria de terminar com algumas estatísticas de criação de perfil sobre por que a drop
solução do @ User é mais lenta que a filtragem baseada em coluna bruta: -
%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)
Uma coluna é basicamente uma matriz, Series
ou seja NumPy
, pode ser indexada sem nenhum custo. Para as pessoas interessadas em como a organização da memória subjacente atua na velocidade de execução, aqui está um ótimo link para acelerar o Pandas :
df[[(len(x) < 2) for x in df['column name']]]
mas a sua é muito melhor. Obrigado pela ajuda!