Cómo crear una columna DataFrame basada en una condición dada en Pandas

Suraj Joshi 30 enero 2023
  1. Lista de comprensión para crear nuevas columnas DataFrame basadas en una condición dada en Pandas
  2. Métodos NumPy para crear nuevas columnas DataFrame basadas en una condición dada en Pandas
  3. pandas.DataFrame.apply para crear nuevas columnas DataFrame basadas en una condición dada en Pandas
  4. pandas.Series.map() para crear nuevas columnas DataFrame basadas en una condición dada en Pandas
Cómo crear una columna DataFrame basada en una condición dada en Pandas

Podemos crear las columnas DataFrame basadas en una condición dada en Pandas utilizando la comprensión de la lista, los métodos NumPy, el método apply() y el método map() del objeto DataFrame.

Lista de comprensión para crear nuevas columnas DataFrame basadas en una condición dada en Pandas

Podemos utilizar varias listas de comprensión para crear nuevas columnas DataFrame basadas en una condición dada en Pandas. La comprensión de listas es un método para crear nuevas listas a partir de iterables. Es bastante más rápido y sencillo que otros 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)

Producción :

      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

Crea una nueva columna Status en df cuyo valor es Senior si el salario es mayor o igual a 400, o Junior de lo contrario.

Métodos NumPy para crear nuevas columnas DataFrame basadas en una condición dada en Pandas

También podemos usar los métodos NumPy para crear una columna DataFrame basada en condiciones dadas en Pandas. Podemos utilizar el método np.where() y el método np.select() para este propósito.

Método np.where()

np.where() toma la condición como una entrada y devuelve los índices de elementos que satisfacen la condición dada. Podemos usar este método para crear una columna DataFrame basada en condiciones dadas en Pandas cuando tenemos una sola condición.

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)

Producción :

      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(condtion, x, y) devuelve x si se cumple la condición, de lo contrario, y.

El código anterior crea una nueva columna Status en df cuyo valor es Senior si se cumple la condición dada; de lo contrario, el valor se establece en Junior.

Método np.select()

np.where() toma la lista de condiciones y la lista de opciones como entrada y devuelve un array construida a partir de elementos en la lista de opciones, dependiendo de las condiciones. Podemos usar este método para crear una columna DataFrame basada en condiciones dadas en Pandas cuando tenemos dos o más condiciones.

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)

Producción :

         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

Aquí, si se cumple la primera condición de la lista de condiciones para una fila, el valor de la columna Salary_Range para esa fila específica se establece en el primer elemento de la lista de selección. Otras condiciones en la lista de condiciones son similares. Si no se cumple ninguna de las condiciones en la lista de condiciones, el valor de la columna Salary_Range para esa fila se establece en el valor del parámetro default en el método np.where() , por ejemplo, Not Specified.

pandas.DataFrame.apply para crear nuevas columnas DataFrame basadas en una condición dada en Pandas

pandas.DataFrame.apply devuelve un DataFrame
como resultado de aplicar la función dada a lo largo del eje dado del DataFrame.

Sintaxis:

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

func representa la función que se aplicará.

axis representa el eje a lo largo del cual se aplica la función. Podemos usar axis=1 o axis = 'columns' para aplicar la función a cada fila.

Podemos usar este método para verificar la condición y establecer valores para cada fila de una nueva columna.

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)

Producción :

      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

Aquí, definimos una función set_values() que se aplica a cada fila usando df.apply(). La función establece el valor de cada fila de la columna Salary_Range dependiendo del valor de la columna Salario de esa fila. Hacemos map_dictionary para asignar cuál será el valor de la columna Salary_Range para una fila dado su valor en la columna Salary. Este método nos proporciona mucha más flexibilidad cuando tenemos una gran cantidad de opciones para la nueva columna.

pandas.Series.map() para crear nuevas columnas DataFrame basadas en una condición dada en Pandas

También podríamos usar pandas.Series.map() para crear un nuevo DataFrame columnas basadas en una condición dada en Pandas. Este método se aplica por elementos para Series y asigna valores de una columna a otra en función de la entrada que podría ser un diccionario, función o 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)

Producción :

      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

Crea una nueva columna Salary_Range y establece los valores de cada fila de la columna en función de los pares clave-valor en map_dictionary.

Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

Artículo relacionado - Pandas DataFrame Column

Artículo relacionado - Pandas Condition