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 features 和 supported 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