Eu tenho um quadro de dados pandas com poucas colunas.
Agora eu sei que certas linhas são discrepantes com base em um determinado valor de coluna.
Por exemplo
a coluna 'Vol' tem todos os valores ao redor
12xx
e um valor é4000
(outlier).
Agora eu gostaria de excluir as linhas que possuem Vol
colunas como esta.
Então, basicamente, eu preciso colocar um filtro no quadro de dados para selecionar todas as linhas em que os valores de uma determinada coluna estejam dentro, digamos, de 3 desvios padrão da média.
Qual é uma maneira elegante de conseguir isso?
Use a
boolean
indexação como faria emnumpy.array
Para uma série, é semelhante:
fonte
DataFrame.abs()
FYI, tambémDataFrame.clip()
clip()
Jeff, os contornos não são removidos:df.SOME_DATA.clip(-3std,+3std)
atribua os contornos a + 3std ou -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Mas, ao contrário de aplicá-lo a uma série ou coluna única, isso substituirá os outliersnp.nan
e manterá a forma do DataFrame, portanto, pode ser necessária interpolação para preencher os valores ausentes.Para cada coluna da estrutura de dados, você pode obter quantil com:
e depois filtre com:
Se for necessário remover os valores discrepantes inferior e superior, combine a condição com uma instrução AND:
fonte
Essa resposta é semelhante à fornecida por @tanemaki, mas usa uma
lambda
expressão em vez descipy stats
.Para filtrar o DataFrame em que apenas UMA coluna (por exemplo, 'B') está dentro de três desvios padrão:
Veja aqui como aplicar esse escore z de forma contínua: Escore Z contínuo aplicado ao quadro de dados do pandas
fonte
fonte
Para cada série no quadro de dados, você pode usar
between
equantile
remover discrepâncias.fonte
Desde que eu não vi uma resposta que lida com números atributos e não numéricos , aqui está uma resposta complementar.
Convém excluir os valores discrepantes apenas em atributos numéricos (as variáveis categóricas dificilmente podem ser discrepantes).
Definição de função
Estendi a sugestão de @ tanemaki para manipular dados quando atributos não numéricos também estão presentes:
Uso
Exemplo
Imagine um conjunto de dados
df
com alguns valores sobre casas: beco, contorno do terreno, preço de venda, ... Por exemplo: Documentação de DadosPrimeiro, você deseja visualizar os dados em um gráfico de dispersão (com z-score Thresh = 3):
fonte
reduce=False
está obsoleto desde apandas
versão 0.23.0result_type='reduce'
porreduce=False
.scipy.stats
possui métodostrim1()
etrimboth()
recorte os outliers em uma única linha, de acordo com a classificação e uma porcentagem introduzida de valores removidos.fonte
trimboth
foi mais fácil para mim.Outra opção é transformar seus dados para que o efeito de outliers seja atenuado. Você pode fazer isso com a vitória de seus dados.
fonte
Se você gosta do encadeamento de métodos, pode obter sua condição booleana para todas as colunas numéricas como esta:
Cada valor de cada coluna será convertido para com
True/False
base em se está a menos de três desvios padrão da média ou não.fonte
le(3)
desde a remoção de outliers. Desta forma, você obtémTrue
os valores extremos. Além do +1 e esta resposta deve ser maiorVocê pode usar a máscara booleana:
resultado:
fonte
Como estou em um estágio muito inicial da minha jornada de ciência de dados, estou tratando discrepâncias com o código abaixo.
fonte
Obtenha o 98º e o 2º percentil como limites de nossos valores extremos
fonte
segue um exemplo completo com dados e 2 grupos:
Importações:
Exemplo de dados com 2 grupos: G1: Grupo 1. G2: Grupo 2:
Leia dados de texto no panda dataframe:
Definir os valores extremos usando desvios padrão
Defina os valores dos dados filtrados e os outliers:
Imprima o resultado:
fonte
Minha função de eliminar valores extremos
fonte
Eu prefiro recortar do que largar. o seguinte será colocado no segundo e no 98º pecentiles.
fonte
Excluindo e eliminando valores discrepantes, acredito que esteja errado estatisticamente. Torna os dados diferentes dos dados originais. Também torna os dados de forma desigual e, portanto, a melhor maneira é reduzir ou evitar o efeito de outliers, transformando os dados em log. Isso funcionou para mim:
fonte