Posso usar a pandas
dropna()
funcionalidade para remover linhas com algumas ou todas as colunas definidas como NA
's. Existe uma função equivalente para descartar linhas com todas as colunas com valor 0?
P kt b tt mky depth
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
5 1.1 3 4.5 2.3 9.0
Neste exemplo, gostaríamos de eliminar as primeiras 4 linhas do quadro de dados.
obrigado!
Respostas:
Acontece que isso pode ser bem expresso de uma forma vetorizada:
fonte
df = df[(df.T != 0).any()]
rows with all columns having value 0
, mas pode-se inferir oall
método.One-liner. Sem necessidade de transposição:
E pra quem gosta de simetria, isso também funciona ...
fonte
df.loc[(df != 0).any(1)]
. Trabalho em equipe!axis=1
por ser explícito; mais pitônico na minha opiniãodf
df = df.loc[(df!=0).all(axis=1)]
edf = df.loc[(df!=0).any(axis=1)]
descartar linhas com quaisquer zeros, pois seria o equivalente real a dropna ().Eu procuro esta questão uma vez por mês e sempre tenho que descobrir a melhor resposta dos comentários:
Obrigado Dan Allan!
fonte
Substitua os zeros por
nan
e, em seguida, elimine as linhas com todas as entradas comonan
. Depois disso, substituanan
por zeros.fonte
Acho que essa solução é a mais curta:
fonte
Algumas soluções que descobri serem úteis ao pesquisar isso, especialmente para conjuntos de dados maiores:
Continuando com o exemplo de @ U2EF1:
Em um conjunto de dados maior:
fonte
df[~(df.values.prod(axis=1) == 0) | ~(df.values.sum(axis=1)==0)]
bdf[np.square(bdf.values).sum(axis=1) != 0]
Resultado:
fonte
ValueError: labels [True ... ] not contained in matrix
df = df.drop(temp)
usardf = df.drop(df[temp].index)
Você pode usar uma
lambda
função rápida para verificar se todos os valores em uma determinada linha são0
. Em seguida, você pode usar o resultado da aplicação dissolambda
como uma forma de escolher apenas as linhas que correspondem ou não a essa condição:Rendimentos:
fonte
Outra alternativa:
fonte
Para mim, este código:
df.loc[(df!=0).any(axis=0)]
não funcionou. Ele retornou o conjunto de dados exato.Em vez disso, usei
df.loc[:, (df!=0).any(axis=0)]
e eliminei todas as colunas com valor 0 no conjunto de dadosA função
.all()
eliminou todas as colunas nas quais há qualquer valor zero em meu conjunto de dados.fonte
Tente este comando está funcionando perfeitamente.
fonte
Para eliminar todas as colunas com valores 0 em qualquer linha:
fonte