pandas.DataFrame.apply#

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

沿 DataFrame 的轴应用函数。

传递给函数的对象是 Series 对象,其索引是 DataFrame 的索引(axis=0)或 DataFrame 的列(axis=1)。默认情况下(result_type=None),最终返回类型根据应用函数的返回类型推断。否则,它取决于 result_type 参数。

Parameters:
funcfunction

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

axis{0 或 ‘index’, 1 或 ‘columns’}, default 0

应用函数的轴:

  • 0 或 ‘index’:将函数应用于每一列。

  • 1 或 ‘columns’:将函数应用于每一行。

rawbool,默认 False

确定是按 Series 还是 ndarray 对象传递行或列:

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

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

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

这些仅在 ``axis=1``(列)时生效:

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

  • ‘reduce’:如果可能,返回一个 Series 而不是展开列表状的结果。这与 ‘expand’ 相反。

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

默认行为(None)取决于应用函数的返回值:列表状的结果将作为 Series 返回。然而,如果 apply 函数返回一个 Series,它们将被展开为列。

argstuple

除了数组/序列之外,还要传递给 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’

numba 引擎将尝试 JIT 编译传递的函数,这可能会为大型 DataFrame 带来速度提升。它还支持以下 engine_kwargs:

nopython(以 nopython 模式编译函数)

  • nogil(在 JIT 编译的函数内释放 GIL)

  • parallel(尝试在 DataFrame 上并行应用函数)

  • 注意:由于 numba 的限制/pandas 与 numba 的接口方式,您应该只在 raw=True 时使用此选项。

    Note: Due to limitations within numba/how pandas interfaces with numba, you should only use this if raw=True

注意:numba 编译器仅支持 Python/numpy 操作的一个子集。

请阅读更多关于 numba 中 supported python featuressupported numpy features 以了解您可以在传入函数中使用或不能使用的内容。

在 2.2.0 版本加入.

engine_kwargsdict

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

**kwargs

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

Returns:
Series 或 DataFrame

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

参见

DataFrame.map

用于逐元素操作。

DataFrame.aggregate

仅执行聚合类型操作。

DataFrame.transform

仅执行转换类型操作。

Notes

修改传入对象的函数可能会导致意外行为或错误,因此不受支持。有关详细信息,请参阅 使用用户定义函数 (UDF) 方法进行变异

Examples

>>> 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