python中 apply() 方法使用技巧

131 阅读4分钟

大家好,我是小寒

原文链接

今天给大家带来一篇 如何在 pandas 上使用 apply 方法,如果觉得不错,欢迎关注起来。

本文的内容主要如下:

  • 在 Pandas Series 上使用 apply() 方法
  • 在 Pandas Dataframe 上使用 apply() 方法
  • 使用 apply() 方法的四个用例

apply() 方法主要用于数据清理,它专注于将方法应用于 pandas Series 中的每个元素以及 pandas DataFrame 的每一行/列。

在 Pandas Series 上使用 apply() 方法

Series 是一维数组,它具有名为索引的轴标签,并且还包含不同类型的数据,例如字符串、整数和其他 Python 对象。

让我们来创建一个 Series 对象,其中索引为行星,数据为对应行星的直径(以千米为单位)。

import pandas as pd

import numpy as np

planetinfo = pd.Series(data=[12750, 6800, 142800, 120660],
                       index=["Earth", "Mars", "Jupiter", "Saturn"])

planetinfo

输出为:

Earth       12750
Mars         6800
Jupiter    142800
Saturn     120660
dtype: int64

让我们看看如何使用 apply() 方法将每个行星的直径以千米为单位转换为英里(每千米等于0.6214英里)。

def km_to_miles(data):
  return 0.6214 * data

print(planetinfo.apply(km_to_miles))

输出:

Earth       7922.850
Mars        4225.520
Jupiter    88735.920
Saturn     74978.124
dtype: float64

上面的代码返回了每个行星的直径英里的转换。

为此,我们首先定义了一个名为 km_to_miles() 的函数,然后我们将不带任何括号的函数传递给 apply() 方法。

apply() 方法然后获取 Series 中的每个数据点并对其应用 km_to_miles() 函数。

在 Pandas Dataframe 上使用 apply() 方法

首先我们先创建一个 Dataframe,以了解如何使用 apply() 方法在 Dataframe 中进行行和列的操作。

studentinfo=pd.DataFrame({'STUDENT_NAME':["MarkDavis","PriyaSingh","KimNaamjoon","TomKozoyed","TommyWalker"],
                         "ACADEMIC_STANDING":["Good","Warning","Probabtion","Suspension","Warning"],
                         "ATTENDANCE_PERCENTAGE":[0.8,0.75,0.25,0.12,0.30],
                         "MID_TERM_GRADE": ["A+","B-","D+","D-","F"]})

studentinfo

我们现在创建了一个名为 studentinfo 的数据框,并将通过探索 4 个不同的用例来学习如何使用 apply() 方法。

案例一、

作为数据清理检查的一部分,我们将检查 STUDENT_NAME 列中的所有值是否都只是字母。为此,我们将定义一个名为 datacheck() 的函数,该函数获取 STUDENT_NAME 列并使用 isalpha() 方法返回 True 或 False。

def datacheck(data):
  if data.isalpha():
   return True
  else:
   return False

现在我们将通过实现 apply() 方法对 studentinfo 数据框的 STUDENT_NAME 列应用 datacheck() 函数。

studentinfo["IS_ALPHABET"] = studentinfo["STUDENT_NAME"].apply(datacheck)
studentinfo

输出为:

我们可以看到 datacheck() 函数是如何应用于 STUDENT_NAME 列的每一行的,并且返回的结果存储在一个名为 IS_ALPHABET 的新列中。

案例二

我们对 ACADEMIC_STANDING 列进行处理,其中我们将类别 Good 标记为 ACADEMIC_STANDING_GOOD,其余类别标记为 ACADEMIC_STANDING_BAD。

为了实现这个用例,我们将定义一个名为 reduce_cardinality() 的函数,它获取列 ACADEMIC_STANDING。在函数内部,if 语句将用于比较检查,最后将 ACADEMIC_STANDING_GOOD 和 ACADEMIC_STANDING_BAD 返回到 ACADEMIC_STANDING 列中。

def reduce_cardinality(data):
  if data != "Good":
   return "ACADEMIC_STANDING_BAD"
  else:
   return "ACADEMIC_STANDING_GOOD"

现在我们将通过实现 apply() 方法在 studentinfo 数据框的 ACADEMIC_STANDING 列上应用 reduce_cardinality() 函数。

studentinfo["ACADEMIC_STANDING"]=studentinfo["ACADEMIC_STANDING"].apply(reduce_cardinality)
studentinfo

输出为:

我们可以看到如何在 ACADEMIC_STANDING 列的每一行上应用 reduce_cardinality() 函数,其中 ACADEMIC_STANDING 列中的原始值现在已修改为两个不同的类别,即 ACADEMIC_STANDING_BAD 和 ACADEMIC_STANDING_GOOD,从而减少了数据中类别数。

用例三

在这个用例中,我们将再次减少列 MID_TERM 的类别数,我们将以 A、B、C 开头的等级标记为 Corhigher,以 D、F、W 开头的等级标记为 Dorlower。

为了实现这个用例,我们将定义一个名为 reduce_cardinality_grade() 的函数。

def reduce_cardinality_grade(data):
  if data.startswith('A'):
   return "Corhigher"
  elif data.startswith('B'):
   return "Corhigher"
  elif data.startswith('C'):
   return "Corhigher"
  else:
   return "Dorlower"

现在我们将通过实现 apply() 方法在 studentinfo 数据框的 MID_TERM_GRADE 列上应用 reduce_cardinality_grade() 函数。

studentinfo["MID_TERM_GRADE"]=studentinfo["MID_TERM_GRADE"].apply(reduce_cardinality_grade)
studentinfo

我们可以看到如何在 MID_TERM_GRADE 列的每一行上应用 reduce_cardinality_grade() 函数,其中 MID_TERM_GRADE 列中的原始值现在已被修改为两个不同的类别,即 Corhigher 和 Dorlower,从而降低了基数。

用例四

我们将使用函数 check() 来创建一个名为 FINAL_GRADE_STATUS 的新列,其中 FINAL_GRADE_STATUS 中的值将根据以下两个条件确定:

  • 如果学生的 ATTENDANCE_PERCENTAGE >= 0.6 并且 MID_TERM_GRADE 为 Corhigher,将被标记为 High_Chance_Of_Passing

  • 如果学生的 ATTENDANCE_PERCENTAGE < 0.6 并且 MID_TERM_GRADE 为 Dorlower,将被标记为 Low_Chance_Of_Passing

def check(data):
  if (data["ATTENDANCE_PERCENTAGE"] >= 0.6) and (data["MID_TERM_GRADE"] == "Corhigher"):
   return "High_Chance_Of_Passing"
  elif (data["ATTENDANCE_PERCENTAGE"] < 0.6) and (data["MID_TERM_GRADE"] == "Dorlower"):
   return "Low_Chance_Of_Passing"

现在我们将通过实现 apply() 方法对 studentinfo 数据框的 ATTENDANCE_PERCENTAGE、MID_TERM_GRADE 列应用 check() 函数。axis=1 参数表示遍历数据框中的行。

studentinfo["FINAL_GRADE_STATUS"]=studentinfo[["ATTENDANCE_PERCENTAGE","MID_TERM_GRADE"]].apply(check,axis = 1)
studentinfo

我们可以看到 check() 函数如何应用于 MID_TERM_GRADE 和 ATTENDANCE_PERCENTAGE 列的每一行,从而返回一个名为 FINAL_GRADE_STATUS 的新列。

在本文中,我们通过探索不同的用例了解了如何使用 apply() 方法。apply() 方法使用户能够对 Series 或 Dataframe的每个值执行不同类型的数据操作。

最后

今天简单介绍了一下如何在 pandas 中使用 apply() 方法。