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