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 参数。

参数:
函数函数

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

{0 或 ‘index’, 1 或 ‘columns’}, 默认 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) 取决于所应用函数的返回值:类似列表的结果将作为这些的系列返回。然而,如果应用函数返回一个系列,这些将被扩展为列。

参数tuple

传递给 func 的位置参数,除了数组/序列之外。

按行False 或 “compat”,默认 “compat”

只有在 func 是一个函数列表或字典且 func 不是字符串时才有效。如果是 “compat”,将尽可能首先将 func 转换为 pandas 方法(例如 Series().apply(np.sum) 将转换为 Series().sum())。如果这不起作用,将尝试使用 by_row=True 再次调用 apply,如果失败,将使用 by_row=False 再次调用 apply(向后兼容)。如果为 False,函数将一次性传递整个 Series。

Added in version 2.1.0.

引擎{‘python’, ‘numba’}, 默认 ‘python’

在apply中选择python(默认)引擎或numba引擎。

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

  • nopython (以 nopython 模式编译函数)

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

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

    注意:由于 numba 的限制/pandas 与 numba 接口的方式,只有在 raw=True 时才应使用此功能。

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

请阅读更多关于 支持的 Python 特性支持的 numpy 特性 在 numba 中的内容,以了解您可以在传递的函数中使用或不能使用的内容。

Added in version 2.2.0.

engine_kwargsdict

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

**kwargs

传递给 func 的额外关键字参数。

返回:
系列或数据框

在DataFrame的给定轴上应用 func 的结果。

参见

DataFrame.map

对于逐元素操作。

DataFrame.aggregate

仅执行聚合类型的操作。

DataFrame.transform

仅执行转换类型的操作。

备注

修改传递对象的函数可能会产生意外行为或错误,并且不受支持。更多详情请参见 使用用户定义函数 (UDF) 方法进行变异

示例

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