Crea colonna DataFrame in base alla condizione data in Pandas

Suraj Joshi 30 gennaio 2023
  1. Comprensione dell’lista per creare nuove colonne DataFrame in base a una determinata condizione in Pandas
  2. Metodi NumPy per creare nuove colonne DataFrame in base a una determinata condizione in Pandas
  3. pandas.DataFrame.apply per creare nuove colonne DataFrame in base a una determinata condizione in Pandas
  4. pandas.Series.map() per creare nuove colonne DataFrame basate su una determinata condizione in Pandas
Crea colonna DataFrame in base alla condizione data in Pandas

Possiamo creare le colonne DataFrame basate su una data condizione in Pandas usando la comprensione della lista, i metodi NumPy, il metodo apply() e il metodo map() dell’oggetto DataFrame.

Comprensione dell’lista per creare nuove colonne DataFrame in base a una determinata condizione in Pandas

Possiamo utilizzare varie Comprensione delle liste per creare nuove colonne DataFrame basate su una data condizione in Pandas. La comprensione degli liste è un metodo per creare nuovi liste da iterabili. È abbastanza più veloce e più semplice di altri metodi.

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)

Produzione:

      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 nuova colonna Status in df il cui valore è Senior se lo stipendio è maggiore o uguale a 400, altrimenti Junior.

Metodi NumPy per creare nuove colonne DataFrame in base a una determinata condizione in Pandas

Possiamo anche usare i metodi NumPy per creare una colonna DataFrame basata su determinate condizioni in Pandas. Possiamo utilizzare il metodo np.where() e il metodo np.select() per questo scopo.

Metodo np.where()

np.where() accetta la condizione come input e restituisce gli indici degli elementi che soddisfano la condizione data. Possiamo usare questo metodo per creare una colonna DataFrame basata su determinate condizioni in Pandas quando abbiamo una sola condizione.

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)

Produzione:

      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) restituisce x se la condizione è soddisfatta, altrimenti y.

Il codice precedente crea una nuova colonna Status in df il cui valore è Senior se la condizione data è soddisfatta; in caso contrario, il valore è impostato su Junior.

Metodo np.select()

np.where() accetta condition-list e choice-list come input e restituisce un array costruito dagli elementi in choice-list, a seconda delle condizioni. Possiamo utilizzare questo metodo per creare una colonna DataFrame basata su determinate condizioni in Pandas quando abbiamo due o più condizioni.

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)

Produzione:

         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

Qui, se la prima condizione nella conditionlist è soddisfatta per una riga, il valore della colonna Salary_Range per quella specifica riga è impostato al primo elemento nella choicelist. Altre condizioni nella conditionlist sono simili. Se nessuna delle condizioni nella conditionlist è soddisfatta, il valore della colonna Salary_Range per quella riga è impostato sul valore del parametro default nel metodo np.where(), ad esempio, Not Specified.

pandas.DataFrame.apply per creare nuove colonne DataFrame in base a una determinata condizione in Pandas

pandas.DataFrame.apply restituisce un DataFrame
come risultato dell’applicazione della funzione data lungo l’asse specificato del DataFrame.

Sintassi:

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

func rappresenta la funzione da applicare.

axis rappresenta l’asse lungo il quale viene applicata la funzione. Possiamo usare axis=1 o axis = 'columns' per applicare la funzione a ciascuna riga.

Possiamo utilizzare questo metodo per verificare la condizione e impostare i valori per ogni riga di una nuova colonna.

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)

Produzione:

      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

Qui, definiamo una funzione set_values() che viene applicata a ogni riga usando df.apply(). La funzione imposta il valore di ogni riga della colonna Salary_Range a seconda del valore della colonna Salary di quella riga. Creiamo map_dictionary per assegnare quello che sarà il valore della colonna Salary_Range per una riga dato il suo valore nella colonna Salary. Questo metodo ci fornisce molta più flessibilità quando abbiamo un gran numero di opzioni per la nuova colonna.

pandas.Series.map() per creare nuove colonne DataFrame basate su una determinata condizione in Pandas

Potremmo anche usare pandas.Series.map() per creare nuove colonne DataFrame basate su una data condizione in Pandas. Questo metodo viene applicato in modo elementare per Series e mappa i valori da una colonna all’altra in base all’input che potrebbe essere un dizionario, una funzione o una 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)

Produzione:

      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 nuova colonna Salary_Range e imposta i valori di ogni riga della colonna a seconda delle coppie chiave-valore in map_dictionary.

Autore: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

Articolo correlato - Pandas DataFrame Column