Como criar uma coluna DataFrame com base em uma determinada condição em Pandas

Suraj Joshi 30 janeiro 2023
  1. Compreensão de lista para criar novas colunas DataFrame com base em uma determinada condição em Pandas
  2. Métodos para criar novas colunas de dados com base em uma determinada condição em Pandas
  3. pandas.DataFrame.apply para criar novas colunas DataFrame baseadas em uma determinada condição em Pandas
  4. pandas.Series.map() para criar novas colunas DataFrame com base em uma determinada condição em Pandas
Como criar uma coluna DataFrame com base em uma determinada condição em Pandas

Podemos criar as colunas DataFrame com base em uma dada condição em Pandas utilizando técnicas de compreensão de lista, métodos NumPy, método apply() e método map() do objeto DataFrame.

Compreensão de lista para criar novas colunas DataFrame com base em uma determinada condição em Pandas

Podemos utilizar várias compreensões de listas para criar novas colunas DataFrame com base em uma determinada condição em Pandas. A compreensão de listas é um método para criar novas listas a partir de iterables. É bastante mais rápido e simples do que outros métodos.

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)
df["Status"] = ["Senior" if s >= 400 else "Junior" for s in df["Salary"]]
print(df)

Resultado:

      Name Joined date  Salary  Status
0   Hisila  2019-11-20     200  Junior
1  Shristi  2020-01-02     400  Senior
2    Zeppy  2020-02-05     300  Junior
3    Alina  2020-03-10     500  Senior
4    Jerry  2020-04-16     600  Senior
5    Kevin  2020-05-01     300  Junior

Cria uma nova coluna Status em df cujo valor é Senior se o salário for maior ou igual a 400, ou Junior caso contrário.

Métodos para criar novas colunas de dados com base em uma determinada condição em Pandas

Também podemos utilizar os métodos NumPy para criar uma coluna DataFrame com base em determinadas condições em Pandas. Podemos utilizar o método np.where() e o método np.select() para este fim.

np.where() Método

np.where() toma a condição como uma entrada e retorna os índices de elementos que satisfazem a condição dada. Podemos utilizar este método para criar uma coluna DataFrame com base em determinadas condições em Pandas quando temos apenas uma condição.

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

df["Status"] = np.where(df["Salary"] >= 400, "Senior", "Junior")
print(df)

Resultado:

      Name Joined date  Salary  Status
0   Hisila  2019-11-20     200  Junior
1  Shristi  2020-01-02     400  Senior
2    Zeppy  2020-02-05     300  Junior
3    Alina  2020-03-10     500  Senior
4    Jerry  2020-04-16     600  Senior
5    Kevin  2020-05-01     300  Junior

np.where(condition, x, y) retorna x se a condição for atendida, caso contrário y.

O código acima cria uma nova coluna Status em df cujo valor é Senior se a condição dada for satisfeita; caso contrário, o valor é definido como Junior.

np.select() Método

np.where() toma a lista de condições e lista de escolha como uma entrada e retorna uma array construída a partir de elementos da lista de escolha, dependendo das condições. Podemos utilizar este método para criar uma coluna DataFrame com base em determinadas condições em Pandas quando temos duas ou mais condições.

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

conditionlist = [
    (df["Salary"] >= 500),
    (df["Salary"] >= 300) & (df["Salary"] < 300),
    (df["Salary"] <= 300),
]
choicelist = ["High", "Mid", "Low"]
df["Salary_Range"] = np.select(conditionlist, choicelist, default="Not Specified")

print(df)

Resultado:

         Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400        black
2    Zeppy  2020-02-05     300          Low
3    Alina  2020-03-10     500         High
4    Jerry  2020-04-16     600         High
5    Kevin  2020-05-01     300          Low

Aqui, se a primeira condição na conditionlist for satisfeita para uma linha, o valor da coluna Salary_Range para essa linha específica é definido para o 1º elemento na choicelist. Outras condições na conditionlist são similares. Se nenhuma das condições na lista de condições for satisfeita, o valor da coluna Salary_Range para aquela linha é definido para o valor do parâmetro default no método np.where(), por exemplo, Not Specified.

pandas.DataFrame.apply para criar novas colunas DataFrame baseadas em uma determinada condição em Pandas

pandas.DataFrame.apply retorna um DataFrame
como resultado da aplicação da função dada ao longo do eixo dado do DataFrame.

Sintaxe:

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)

func representa a função a ser aplicada.

axis representa o eixo ao longo do qual a função é aplicada. Podemos utilizar axis=1 ou axis = 'columns' para aplicar a função a cada linha.

Podemos utilizar este método para verificar a condição e definir valores para cada linha de uma nova coluna.

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)


def set_values(row, value):
    return value[row]


map_dictionary = {200: "Low", 300: "LOW", 400: "MID", 500: "HIGH", 600: "HIGH"}

df["Salary_Range"] = df["Salary"].apply(set_values, args=(map_dictionary,))

print(df)

Resultado:

      Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400          MID
2    Zeppy  2020-02-05     300          LOW
3    Alina  2020-03-10     500         HIGH
4    Jerry  2020-04-16     600         HIGH
5    Kevin  2020-05-01     300          LOW

Aqui, definimos uma função set_values() que é aplicada a cada linha utilizando df.apply(). A função define o valor de cada linha da coluna Salary_Range, dependendo do valor da coluna Salary dessa linha. Fazemos o map_dictionary para atribuir qual será o valor da coluna Salary_Range para uma linha dado seu valor na coluna Salary. Este método nos proporciona muito mais flexibilidade quando temos um grande número de opções para a nova coluna.

pandas.Series.map() para criar novas colunas DataFrame com base em uma determinada condição em Pandas

Também poderíamos utilizar pandas.Series.map() para criar novas colunas DataFrame com base em uma determinada condição em Pandas. Este método é aplicado elementarmente para Series e mapeia valores de uma coluna para a outra com base na entrada que poderia ser um dicionário, função, ou Series.

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

map_dictionary = {200: "Low", 300: "LOW", 400: "MID", 500: "HIGH", 600: "HIGH"}

df["Salary_Range"] = df["Salary"].map(map_dictionary)

print(df)

Resultado:

      Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400          MID
2    Zeppy  2020-02-05     300          LOW
3    Alina  2020-03-10     500         HIGH
4    Jerry  2020-04-16     600         HIGH
5    Kevin  2020-05-01     300          LOW

Ele cria uma nova coluna Salary_Range e define os valores de cada linha da coluna dependendo dos pares de valores chave no map_dictionary.

Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

Artigo relacionado - Pandas DataFrame Column