pandas.DataFrame.apply#

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), by_row='compat', engine=None, engine_kwargs=None, **kwargs)[源代码]#

沿 DataFrame 的轴应用函数。

传递给函数的对象是 Series 对象,其索引是 DataFrame 的索引(axis=0)或 DataFrame 的列(axis=1)。 默认情况下(result_type=None),最终返回类型由应用函数的返回类型推断。否则,它取决于 result_type 参数。 应用函数的返回类型是根据将函数应用于 Series 对象后获得的第一个计算结果来推断的。

参数:
func函数

要应用于每个列或行的函数。

axis{0 或 ‘index’, 1 或 ‘columns’}, 默认为 0

应用函数的轴

  • 0 或 ‘index’: 对每列应用函数。

  • 1 或 ‘columns’: 对每行应用函数。

rawbool, 默认为 False

确定行或列是作为 Series 还是 ndarray 对象传递

  • False : 将每一行或每一列作为 Series 传递给函数。

  • True : 传递的函数将接收 ndarray 对象。如果您只是应用 NumPy 归约函数,这将大大提高性能。

注意

raw=True 时,结果 dtype 是根据 **第一个** 返回值推断的。

result_type{‘expand’, ‘reduce’, ‘broadcast’, None}, 默认为 None

这些仅在 axis=1 (columns) 时生效

  • ‘expand’ : 列表状结果将被转换为列。

  • ‘reduce’ : 尽可能返回 Series 而不是展开列表状结果。这是 ‘expand’ 的反向操作。

  • ‘broadcast’ : 结果将广播到 DataFrame 的原始形状,保留原始索引和列。

默认行为 (None) 取决于应用函数的返回值:列表状结果将作为 Series 返回。但是,如果 apply 函数返回 Series,则会将其展开为列。

argstuple

除了数组/Series 之外,还要传递给 func 的位置参数。

by_rowFalse 或 “compat”, 默认为 “compat”

仅当 func 是 funcs 的列表状或字典状,并且 func 不是字符串时才生效。如果为 “compat”,将尽可能先将 func 翻译为 pandas 方法(例如,Series().apply(np.sum) 将被翻译为 Series().sum())。如果不行,将尝试使用 by_row=True 再次调用 apply,如果仍然失败,则将使用 by_row=False 再次调用 apply(向后兼容)。如果为 False,funcs 将一次性接收整个 Series。

版本 2.1.0 中添加。

engine装饰器或 {‘python’, ‘numba’}, 可选

选择要使用的执行引擎。如果未提供,函数将由常规 Python 解释器执行。

其他选项包括 JIT 编译器,如 Numba 和 Bodo,在某些情况下可以加速执行。要使用执行器,可以提供装饰器 numba.jitnumba.njitbodo.jit。您也可以提供带参数的装饰器,例如 numba.jit(nogit=True)

并非所有函数都能与所有执行引擎一起执行。通常,JIT 编译器需要函数中的类型稳定性(函数中的变量在执行过程中不应改变数据类型)。并且并非所有 pandas 和 NumPy API 都受支持。请查阅引擎文档 [1][2] 了解限制。

警告

字符串参数将在未来的 pandas 版本中停止支持。

版本 2.2.0 中添加。

engine_kwargsdict

将关键字参数传递给引擎。目前仅由 numba 引擎使用,有关更多信息,请参阅 engine 参数的文档。

**kwargs

传递给 func 的其他关键字参数。

返回:
Series 或 DataFrame

沿 DataFrame 的给定轴应用 func 的结果。

另请参阅

DataFrame.map

用于逐元素操作。

DataFrame.aggregate

仅执行聚合类型的操作。

DataFrame.transform

仅执行转换类型的操作。

注意

修改传入对象的函数可能会产生意外行为或错误,并且不受支持。有关更多详细信息,请参阅 使用用户定义函数 (UDF) 方法进行修改

参考文献

[2]

Bodo 文档 <https://docs.bodo.ai/latest/>/

示例

>>> df = pd.DataFrame([[4, 9]] * 3, columns=["A", "B"])
>>> df
   A  B
0  4  9
1  4  9
2  4  9

使用 numpy 通用函数(在本例中与 np.sqrt(df) 相同)

>>> df.apply(np.sqrt)
     A    B
0  2.0  3.0
1  2.0  3.0
2  2.0  3.0

在任一轴上使用归约函数

>>> df.apply(np.sum, axis=0)
A    12
B    27
dtype: int64
>>> df.apply(np.sum, axis=1)
0    13
1    13
2    13
dtype: int64

返回列表状结构将导致一个 Series

>>> df.apply(lambda x: [1, 2], axis=1)
0    [1, 2]
1    [1, 2]
2    [1, 2]
dtype: object

传递 result_type='expand' 将把列表状结果展开为 Dataframe 的列

>>> df.apply(lambda x: [1, 2], axis=1, result_type="expand")
   0  1
0  1  2
1  1  2
2  1  2

在函数内部返回 Series 类似于传递 result_type='expand'。生成的列名将是 Series 的索引。

>>> df.apply(lambda x: pd.Series([1, 2], index=["foo", "bar"]), axis=1)
   foo  bar
0    1    2
1    1    2
2    1    2

传递 result_type='broadcast' 将确保返回相同形状的结果,无论函数返回的是列表状还是标量,并将其广播到该轴。生成的列名将是原始名称。

>>> df.apply(lambda x: [1, 2], axis=1, result_type="broadcast")
   A  B
0  1  2
1  1  2
2  1  2

高级用户可以通过使用即时 (JIT) 编译器来加速代码。pandas 可用的主要 JIT 编译器是 Numba 和 Bodo。通常,JIT 编译仅在传递给 apply 的函数具有类型稳定性(函数中的变量在执行过程中不改变其类型)时才可能。

>>> import bodo
>>> df.apply(lambda x: x.A + x.B, axis=1, engine=bodo.jit)

请注意,JIT 编译仅推荐用于运行时间较长的函数。快速的函数不太可能通过 JIT 编译获得更快的速度。