如何基于 Pandas 中的给定条件创建 DataFrame 列

Suraj Joshi 2023年1月30日 2020年5月21日
  1. 列表推导以根据 Pandas 中的给定条件创建新的 DataFrame
  2. NumPy 方法根据 Pandas 中的给定条件创建新的 DataFrame 列
  3. pandas.DataFrame.apply 根据 Pandas 中的给定条件创建新的 DataFrame 列
  4. pandas.Series.map() 根据 Pandas 中的给定条件创建新的 DataFrame 列
如何基于 Pandas 中的给定条件创建 DataFrame 列

我们可以使用 DataFrame 对象的列表推导,NumPy 方法,apply() 方法和 map() 方法根据 Pandas 中的给定条件创建 DataFrame 列。

列表推导以根据 Pandas 中的给定条件创建新的 DataFrame

我们可以根据 Pandas 中的给定条件,利用各种列表推导来创建新的 DataFrame 列。列表推导是一种从可迭代对象创建新列表的方法。它比其他方法更快,更简单。

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)

输出:

      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

如果 Salary 大于或等于 400,它将在 df 中创建一个新列 Status,其值将为 Senior,否则为 Junior

NumPy 方法根据 Pandas 中的给定条件创建新的 DataFrame 列

我们还可以使用 NumPy 方法根据 Pandas 中的给定条件创建一个 DataFrame 列。为此,我们可以使用 np.where() 方法和 np.select() 方法。

np.where() 方法

np.where() 将条件作为输入并返回满足给定条件的元素的索引。当我们只有一个条件时,可以使用此方法根据 Pandas 中的给定条件创建 DataFrame 列。

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)

输出:

      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) 返回 x,否则返回 y。

如果满足给定条件,上面的代码将在 df 中创建一个新列 Status,其值为 Senior。否则,将该值设置为初级。

np.select() 方法

np.where()将条件列表和选择列表作为输入,并根据条件返回从选择列表中的元素构建的数组。当我们有两个或多个条件时,可以使用此方法根据 Pandas 中的给定条件创建 DataFrame 列。

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)

输出:

         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

这里,如果满足条件列表中的第一个条件的行,则该特定行的列 Salary_Range 的值将被设置为选择列表中的第一个元素。条件列表中的其他条件类似。如果不满足条件列表中的任何条件,则将该行的 Salary_Range 列的值设置为 np.where() 方法中的默认参数的值,例如,Not Specified

pandas.DataFrame.apply 根据 Pandas 中的给定条件创建新的 DataFrame 列

pandas.DataFrame.apply 返回一个 DataFrame
沿 DataFrame 的给定轴应用给定函数的结果。

语法:

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

func 代表要应用的函数。

axis 代表应用该函数的轴。我们可以使用 axis=1axis = 'columns' 将函数应用于每一行。

我们可以使用此方法检查条件并为新列的每一行设置值。

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)

输出:

      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

在这里,我们定义了一个函数 set_values(),该函数使用 df.apply() 应用于每一行。该函数根据该行的 Salary 列的值来设置 Salary_Range 列的每一行的值。我们建立了一个 map_dictionary 来根据 Salary 列中的数据来决定 Salary_Range 列的数值。当新列有很多选项时,此方法为我们提供了更大的灵活性。

pandas.Series.map() 根据 Pandas 中的给定条件创建新的 DataFrame 列

我们也可以使用 pandas.Series.map() 创建新的 DataFrame 列基于 Pandas 中的给定条件。该方法适用于系列的元素方式,并根据可能是字典,函数或系列的输入将值从一列映射到另一列。

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)

输出:

      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

它创建一个新列 Salary_Range,并根据 map_dictionary 中的键值对设置该列每一行的值。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

相关文章 - Pandas DataFrame Column