Como filtrar linhas de dados com base nos valores das colunas em Pandas

  1. Selecionar Linhas de Pandas com base no valor específico da coluna
  2. Selecionar Linhas de Pandas que não contêm valor específico de coluna
  3. Selecione Linhas de Pandas com Valores de Coluna Maior ou Menor do que o Valor Específico
  4. Selecione Linhas de Pandas com base em valores de Múltiplas Colunas
  5. Selecione Fileiras DataFrame com múltiplas condições

Podemos selecionar linhas de DataFrame com base em valores de coluna única ou múltipla. Também podemos obter linhas de DataFrame satisfazendo ou não uma ou mais condições. Isto pode ser feito utilizando o método boolean indexing, positional indexing, label indexing, e query().

Selecionar Linhas de Pandas com base no valor específico da coluna

Podemos selecionar linhas de pandas de um DataFrame que contenha ou não o valor específico para uma coluna. Ele é amplamente utilizado na filtragem do DataFrame com base no valor da coluna.

Selecione Linhas de Pandas que contenham o valor específico de uma coluna

Filtro usando indexação booleana

Na indexação booleana, a princípio geramos uma máscara que é apenas uma série de valores booleanos, representando se a coluna contém ou não o elemento específico.

df_mask=df['col_name']=='specific_value'

Em seguida, aplicamos esta máscara à nossa DataFrame original para filtrar os valores requeridos.

filtered_df = df[df_mask]

Isto retorna a DataFrame filtrada contendo apenas linhas que têm o specific_value para a coluna col_name.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']==300
filtered_df = df[df_mask]
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

Isto dá todas as linhas no df cujos valores Sales são 300.

Filtro utilizando indexação posicional

É semelhante à indexação booleana, mas envolve uma etapa extra. Neste método, primeiro criamos uma máscara booleana e depois encontramos posições nas quais a máscara booleana tem valor True. Em seguida, passamos todas as posições com o valor True na máscara para o método iloc(), de modo que todas as linhas desejadas sejam apenas selecionadas.

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']==300
positions = np.flatnonzero(df_mask)
filtered_df=df.iloc[positions]
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

Isto também dá todas as linhas no df cujos valores de Sales são 300.

Encadeamento de Pandas

Também podemos usar o Pandas Chaining para filtrar pandas dataframe filtro por valor de coluna. Neste método, utilizamos o método pandas.DataFrame.eq() para a coluna DataFrame cujos valores devem ser verificados para comparar a igualdade dos elementos em DataFrame.

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

filtered_df = df[df.Sales.eq(300)]
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

pandas.DataFrame.query()

Poderíamos utilizar pandas.DataFrame.query() para selecionar linhas por valor de coluna em Pandas.

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

filtered_df = df.query('Sales == 300')
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

Se desejarmos atualizar o DataFrame existente, podemos definir inplace=True no método de consulta.

Selecionar Linhas de Pandas que não contêm valor específico de coluna

O método para selecionar linhas de Pandas que não contêm valor de coluna específico é semelhante ao da seleção de linhas de Pandas com valor de coluna específico. A única coisa que precisamos alterar é a condição de que a coluna não contenha valor específico, substituindo == por != ao criar máscaras ou consultas.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']!=300
filtered_df = df[df_mask]
print(filtered_df)

Resultado:

       Date  Sales  Price
0  April-10    200      3
2  April-12    400      2
3  April-13    200      4

Isto seleciona todas as linhas de df cujos valores de Sales não são 300.

Selecione Linhas de Pandas com Valores de Coluna Maior ou Menor do que o Valor Específico

Para selecionar linhas de Pandas com valores de coluna maiores ou menores que o valor específico, utilizamos operadores como >, <=, >= enquanto criamos máscaras ou consultas.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']>=300
filtered_df = df[df_mask]
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
2  April-12    400      2
4  April-14    300      3
5  April-16    300      2

Isto resulta em DataFrame com valores de Sales maiores ou iguais a 300.

Selecione Linhas de Pandas com base em valores de Múltiplas Colunas

Introduzimos métodos de seleção de linhas com base em valores específicos de coluna no DataFrame. Nesta seção, discutiremos métodos para selecionar linhas de Pandas com base em valores de colunas múltiplas.

Selecione Linhas de Pandas que contenham qualquer um dos valores de múltiplas colunas

Para selecionar linhas Pandas que contenham qualquer um dos valores de múltiplas colunas, utilizamos pandas.DataFrame.isin(values) que retorna DataFrame de booleans mostrando se cada elemento do DataFrame está contido em valores ou não. O DataFrame de booleans assim obtido pode ser utilizado para selecionar linhas.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values=[200,400]
filtered_df = df[df.Sales.isin(values)]
print(filtered_df)

Resultado:

       Date  Sales  Price
0  April-10    200      3
2  April-12    400      2
3  April-13    200      4

Ele filtra todas as linhas da DataFrame cujo valor Sales é 200 ou 400.

Selecione Linhas de Pandas que não contenham nenhum dos valores de múltiplas colunas especificadas

Para selecionar as linhas de um DataFrame que não contenha nenhum dos múltiplos valores especificados na coluna, negaremos o DataFrame de booleanos retornados de pandas.DataFrame.isin(valores) colocando o sinal ~ na frente.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values=[200,400]
filtered_df = df[~df.Sales.isin(values)]
print(filtered_df)

Resultado:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

Ele filtra todas as linhas da DataFrame cujo valor de Sales não é nem 200 nem 400.

Selecione Fileiras DataFrame com múltiplas condições

Se quisermos filtrar linhas considerando valores de linhas de múltiplas colunas, fazemos múltiplas condições e as combinamos com operadores &. Agora, a linha só é selecionada quando satisfaz as condições para todas as colunas.

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values_1=[200,400]
values_2=[2,3]
filtered_df = df[df.Sales.isin(values_1)&~df.Price.isin(values_2)]
print(filtered_df)

Resultado:

       Date  Sales  Price
3  April-13    200      4

Filtra todas as linhas da DataFrame cujo valor de Sales é ou 200 ou 400 e o valor de Price não é nem 2 nem 3. A linha na saída só satisfaz ambas as condições em toda a DataFrame.

Artigo relacionado - Pandas DataFrame

  • Como converter Pandas Dataframe em Numpy Array
  • Subtraia duas colunas de um DataFrame Pandas
  • Artigo relacionado - Pandas DataFrame Row

  • Normalizar uma Coluna em Pandas Dataframe
  • Como Obter o Agregado de Pandas Group-By e Sum