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.jit、numba.njit或bodo.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) 方法进行修改。
参考文献
示例
>>> 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 编译获得更快的速度。