HOWTO · Pandas

将函数应用于 Pandas DataFrame 中的每一行

本教程演示了如何对 DataFrame 中的每一行使用 Pandas 应用函数,以及如何将不同的函数作为参数应用,例如对每一行使用 lambda、numpy 和用户定义函数。

本页内容

使用 DataFrame.apply() 和 axis=1 将每一行传递给可调用对象。该对象可以返回转换后的行,apply() 会将这些结果组合成一个 DataFrame。本指南介绍行轴的选择、lambda、NumPy 函数,以及带或不带额外参数的自定义函数。文中的代码块及其中显示的英文标签和输出均保持原样。

Pandas apply() 函数的基本语法

基本形式为 dataframe.apply(function, axis=1, args=())。当可调用对象应接收各行时,设置 axis=1。默认值是 axis=0,此时传递的是各列。按行调用时,可调用对象会收到一个 Series,其索引包含列标签;返回值决定结果的形状。每行返回一个标量会生成 Series;若每行返回的 Series 标签一致,则会生成 DataFrame。

args 用于在行参数之后传入额外的位置参数。如果自定义可调用对象需要一个对所有行都相同的值,可以使用它。完整参数说明请参阅 DataFrame.apply()。

将 lambda 函数应用于 Pandas DataFrame 的每一行

lambda 适合用于简短的转换。此示例将每行中的每个值加 10,并返回列相同的 DataFrame。逻辑较长时,使用具名函数会更易于阅读和复用。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

dataframe = pd.DataFrame([(1, 34, 23), (11, 31, 11)], columns=list("ABC"))
result = dataframe.apply(lambda row: row + 10, axis=1)
print(result)
    A   B   C
0  11  44  33
1  21  41  21

将 NumPy 函数应用于 Pandas DataFrame 的每一行

当 NumPy 可调用对象能作用于行中的每个值时,可以直接传入该对象。在这里,np.sqrt 转换每个数值单元格,apply() 再组合转换后的各行。平方根适用于非负数值;如果数据包含其他类型,或有不同的领域要求,请选择其他运算。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np
import pandas as pd

dataframe = pd.DataFrame([(4, 9, 16), (25, 36, 49)], columns=list("ABC"))
result = dataframe.apply(np.sqrt, axis=1)
print(result)
     A    B    C
0  2.0  3.0  4.0
1  5.0  6.0  7.0

使用带参数的自定义函数处理 Pandas DataFrame 的每一行

当行转换逻辑不止一个简短表达式时,可以将其定义为函数。在此示例中,row 是第一个参数,2 则通过 args 传在其后;函数会将每个值加倍。args 应为位置参数元组,因此只有一个额外值时要写成 (2,)。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

def multiply_row(row, factor):
    return row * factor

dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_row, axis=1, args=(2,))
print(result)
   A   B   C
0  4   6   8
1  6  10  20

使用不带额外参数的自定义函数处理 Pandas DataFrame 的每一行

如果操作不需要所有行共用的参数,可以定义一个只接收行参数的可调用对象,并直接传入。此示例将每行中的每个值乘以 4。返回的行保留原有标签,因此结果是列与原表相同的 DataFrame。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

def multiply_by_four(row):
    return row * 4

dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_by_four, axis=1)
print(result)
    A   B   C
0   8  12  16
1  12  20  40

当操作需要一个接收整行的可调用对象时,使用 apply()。如果转换只是简单的按列算术运算,直接使用向量化表达式会更清晰,也能避免逐行调用 Python。