pandas.DataFrame.apply #

数据框。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 或“列”:将函数应用于每一行。

原始布尔值,默认 False

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

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

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

result_type {'expand', 'reduce', 'broadcast', None}, 默认 None

这些仅在axis=1(列)时起作用:

  • 'expand' :类似列表的结果将变成列。

  • 'reduce' :如果可能的话返回一个系列,而不是扩展类似列表的结果。这与“扩展”相反。

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

默认行为(无)取决于所应用函数的返回值:类似列表的结果将作为一系列结果返回。但是,如果 apply 函数返回一个 Series,那么它们将扩展为列。

参数元组

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

by_row False 或“compat”,默认“compat”

func仅当func 是 listlike 或 dictlike 且 func 不是字符串时才有效。如果“compat”,如果可能的话,将首先将 func 转换为 pandas 方法(例如Series().apply(np.sum)将转换为 Series().sum())。如果这不起作用,将尝试再次调用 apply by_row=True,如果失败,将再次调用 apply by_row=False(向后兼容)。如果为 False,函数将立即传递到整个系列。

2.1.0 版本中的新增功能。

引擎{'python', 'numba'}, 默认 'python'

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

numba 引擎将尝试 JIT 编译传递的函数,这可能会导致大型 DataFrame 的加速。它还支持以下engine_kwargs:

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

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

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

    注意:由于 numba/pandas 与 numba 交互方式的限制,您应该仅在 raw=True 时使用此选项

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

请阅读有关numba 中支持的 python 功能支持的 numpy 功能的更多信息 ,以了解您可以或不能在传递的函数中使用哪些功能。

2.2.0 版本中的新增内容。

engine_kwargs字典

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

**夸格

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

返回
系列或数据框

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

也可以看看

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

返回类似列表的结果将是一个系列

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

传递result_type='expand'会将类似列表的结果扩展到数据框的列

>>> 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'。生成的列名称将是系列索引。

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