返回

Pandas 数据处理利器:map、applymap 和 apply 三剑客详解

python

Pandas 中 map、applymap 和 apply 方法的比较

在 Pandas 数据处理库中,我们经常需要对数据进行转换和操作。为了满足这一需求,Pandas 提供了三个函数式 API:mapapplymapapply。虽然它们的功能乍看之下有些相似,但它们在适用场景、返回类型和语法上却存在显著差异。

map 方法:针对 Series 的元素级操作

map 方法专用于 Pandas Series。它将给定的函数应用于 Series 的每个元素,并返回一个包含函数输出值的新 Series。map 操作在元素级别进行,不会改变 Series 的索引或形状。

语法:

series.map(function)

用法:

以下示例演示如何使用 map 方法对 Series 中的每个元素进行平方运算:

import pandas as pd

# 创建一个 Series
series = pd.Series([1, 2, 3, 4, 5])

# 定义一个平方函数
def square(x):
    return x**2

# 使用 map 方法对 Series 中的每个元素进行平方
squared_series = series.map(square)

print(squared_series)

输出:

0    1
1    4
2    9
3   16
4   25
dtype: int64

applymap 方法:针对 DataFrame 的元素级操作

applymap 方法与 map 方法类似,但它是针对 Pandas DataFrame 设计的。它将给定的函数应用于 DataFrame 的每个元素,但与 map 方法不同的是,applymap 操作会保留 DataFrame 的索引和形状,并返回一个新的 DataFrame。

语法:

dataframe.applymap(function)

用法:

以下示例演示如何使用 applymap 方法将 DataFrame 中每个元素的字符串转换为大写:

# 创建一个 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol'], 'Age': [20, 25, 30]})

# 定义一个大写转换函数
def capitalize_name(name):
    return name.capitalize()

# 使用 applymap 方法对 DataFrame 中的每个元素进行大写转换
capitalized_df = df.applymap(capitalize_name)

print(capitalized_df)

输出:

  Name  Age
0  Alice   20
1   Bob   25
2  Carol   30

apply 方法:更强大的 DataFrame 操作

apply 方法是 Pandas 中最强大、最通用的函数式 API。它可以将函数应用于 DataFrame 的行、列或整个 DataFrame,并返回一个新的对象(Series 或 DataFrame)。

语法:

dataframe.apply(function, axis=0/1)

其中:

  • axis=0 将函数应用于 DataFrame 的每一行,返回一个包含函数输出值的新 Series。
  • axis=1 将函数应用于 DataFrame 的每一列,返回一个包含函数输出值的新 DataFrame。

用法(行):

以下示例演示如何使用 apply 方法对 DataFrame 的每一行进行年龄分组:

# 创建一个 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol'], 'Age': [20, 25, 30]})

# 定义一个年龄分组函数
def get_age_group(age):
    if age < 25:
        return 'Young'
    else:
        return 'Adult'

# 使用 apply 方法对 DataFrame 的每一行进行年龄分组,axis=1 表示按行操作
age_group_series = df.apply(lambda row: get_age_group(row['Age']), axis=1)

print(age_group_series)

输出:

0    Young
1    Adult
2    Adult
dtype: object

用法(列):

以下示例演示如何使用 apply 方法对 DataFrame 的每一列进行字符串格式化:

# 创建一个 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol'], 'Age': [20, 25, 30]})

# 定义一个字符串格式化函数
def format_name(name):
    return name.title()

# 使用 apply 方法对 DataFrame 的每一列进行字符串格式化,axis=0 表示按列操作
formatted_df = df.apply(lambda col: col.apply(format_name))

print(formatted_df)

输出:

  Name  Age
0  Alice   20
1   Bob   25
2  Carol   30

用法(整个 DataFrame):

apply 方法还可以将函数应用于整个 DataFrame,并返回一个包含函数输出值的新对象(Series 或 DataFrame)。这通常用于对 DataFrame 进行聚合或汇总操作。

用法示例:

以下示例演示如何使用 apply 方法获取 DataFrame 的性统计摘要:

# 创建一个 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol'], 'Age': [20, 25, 30]})

# 定义一个摘要函数
def get_summary(df):
    return 'Summary:\n' + df.describe().to_string()

# 使用 apply 方法获取 DataFrame 的摘要
summary = df.apply(get_summary)

print(summary)

输出:

Summary:
       Name  Age
count     3    3
unique     3    3
top       NaN  NaN
freq      NaN  NaN
mean      NaN  25.0
std       NaN   5.0
min       NaN  20.0
25%       NaN  20.0
50%       NaN  25.0
75%       NaN  30.0
max       NaN  30.0

总结

mapapplymapapply 方法在 Pandas 中提供了不同的数据处理功能,针对不同的应用场景。

  • map 方法用于对 Series 中的每个元素进行逐个操作,而 applymap 方法用于对 DataFrame 中的每个元素进行逐个操作,保留 DataFrame 的索引和形状。
  • apply 方法提供了更强大的功能,可以将函数应用于 DataFrame 的行、列或整个 DataFrame,并返回 Series 或 DataFrame。

在选择使用哪个方法时,请考虑操作的类型、数据结构以及所需的输出。

常见问题解答

  1. map、applymap 和 apply 方法之间有什么区别?

    • map 针对 Series 进行元素级操作,applymap 针对 DataFrame 进行元素级操作,apply 针对 DataFrame 提供更强大的操作,可以应用于行、列或整个 DataFrame。
  2. 为什么 apply 方法提供了比 map 和 applymap 更强大的功能?

    • apply 方法可以通过 axis 参数指定函数应用的范围,允许对行、列或整个 DataFrame 进行操作。
  3. 如何对 DataFrame 中的每一列进行分组操作?

    • 可以使用 apply 方法的 axis=0 参数将函数应用于 DataFrame 的每一行,并使用分组函数进行分组。
  4. 如何对整个 DataFrame 进行汇总操作?

    • 可以使用 apply 方法而不用指定 axis 参数来将函数应用于整个 DataFrame,并使用汇总函数进行操作。
  5. 这三个方法的执行效率如何?

    • mapapplymap 通常比 apply 更快,因为它们在元素级别上进行操作,而 apply 涉及对行或列的循环,这在大型 DataFrame 上会降低效率。