pyspark.pandas.DataFrame.apply
的用法。用法:
DataFrame.apply(func: Callable, axis: Union[int, str] = 0, args: Sequence[Any] =(), **kwds: Any) → Union[Series, DataFrame, Index]
沿 DataFrame 的轴应用函数。
传递给函数的对象是 Series 对象,其索引是 DataFrame 的索引 (
axis=0
) 或 DataFrame 的列 (axis=1
)。另见Transform and apply a function。
注意
当
axis
为0 或‘index’ 时,func
无法访问整个输入系列。 pandas-on-Spark 在内部将输入系列拆分为多个批次,并在每个批次中多次调用func
。因此,诸如全局聚合之类的操作是不可能的。请参见下面的示例。>>> # This case does not return the length of whole series but of the batch internally ... # used. ... def length(s) -> int: ... return len(s) ... >>> df = ps.DataFrame({'A': range(1000)}) >>> df.apply(length, axis=0) 0 83 1 83 2 83 ... 10 83 11 83 dtype: int32
注意
此 API 执行该函数一次以推断可能昂贵的类型,例如,在聚合或排序后创建数据集时。
为避免这种情况,请将返回类型指定为
Series
或在func
中指定标量值,例如,如下所示:>>> def square(s) -> ps.Series[np.int32]: ... return s ** 2
pandas-on-Spark 使用返回类型提示并且不尝试推断类型。
如果axis为1,则需要指定
DataFrame
或标量值,类型提示如下:>>> def plus_one(x) -> ps.DataFrame[float, float]: ... return x + 1
如果返回类型指定为
DataFrame
,则输出列名称变为c0, c1, c2 … cn
。这些名称按位置映射到func
中返回的 DataFrame 。要指定列名,您可以使用 pandas 友好的样式指定它们,如下所示:
>>> def plus_one(x) -> ps.DataFrame["a": float, "b": float]: ... return x + 1
>>> pdf = pd.DataFrame({'a': [1, 2, 3], 'b': [3, 4, 5]}) >>> def plus_one(x) -> ps.DataFrame[zip(pdf.dtypes, pdf.columns)]: ... return x + 1
但是,这种方式会在输出中将索引类型切换为默认索引类型,因为此时类型提示无法表示索引类型。使用
reset_index()
保留索引作为一种解决方法。当给定函数注释了返回类型时,DataFrame 的原始索引将丢失,然后将默认索引附加到结果中。请谨慎配置默认索引。另请参阅Default Index Type。
- func:函数
应用于每一列或每一行的函数。
- axis:{0 或 ‘index’,1 或 ‘columns’},默认 0
沿其应用函数的轴:
0 或‘index’:将函数应用于每一列。
1 或‘columns’:将函数应用于每一行。
- args:元组
除了数组/系列之外,要传递给
func
的位置参数。- **kwds:
附加关键字参数作为关键字参数传递给
func
。
- 系列或DataFrame
沿 DataFrame 的给定轴应用
func
的结果。
参数:
返回:
例子:
>>> df = ps.DataFrame([[4, 9]] * 3, columns=['A', 'B']) >>> df A B 0 4 9 1 4 9 2 4 9
使用 numpy 通用函数(在这种情况下与
np.sqrt(df)
相同):>>> def sqrt(x) -> ps.Series[float]: ... return np.sqrt(x) ... >>> df.apply(sqrt, axis=0) A B 0 2.0 3.0 1 2.0 3.0 2 2.0 3.0
您可以省略类型提示并让pandas-on-Spark 推断其类型。
>>> df.apply(np.sqrt, axis=0) A B 0 2.0 3.0 1 2.0 3.0 2 2.0 3.0
当
axis
为 1 或 ‘columns’ 时,它对每一行应用该函数。>>> def summation(x) -> np.int64: ... return np.sum(x) ... >>> df.apply(summation, axis=1) 0 13 1 13 2 13 dtype: int64
同样,您可以省略类型提示并让pandas-on-Spark 推断其类型。
>>> df.apply(np.sum, axis=1) 0 13 1 13 2 13 dtype: int64
>>> df.apply(max, axis=1) 0 9 1 9 2 9 dtype: int64
返回类似列表的结果将是一个系列
>>> df.apply(lambda x: [1, 2], axis=1) 0 [1, 2] 1 [1, 2] 2 [1, 2] dtype: object
为了在
axis
为‘1’ 时指定类型,应使用DataFrame[…] 注释。在这种情况下,会自动生成列名。>>> def identify(x) -> ps.DataFrame['A': np.int64, 'B': np.int64]: ... return x ... >>> df.apply(identify, axis=1) A B 0 4 9 1 4 9 2 4 9
您还可以指定额外的参数。
>>> def plus_two(a, b, c) -> ps.DataFrame[np.int64, np.int64]: ... return a + b + c ... >>> df.apply(plus_two, axis=1, args=(1,), c=3) c0 c1 0 8 13 1 8 13 2 8 13
相关用法
- Python pyspark DataFrame.applymap用法及代码示例
- Python pyspark DataFrame.append用法及代码示例
- Python pyspark DataFrame.align用法及代码示例
- Python pyspark DataFrame.any用法及代码示例
- Python pyspark DataFrame.alias用法及代码示例
- Python pyspark DataFrame.at用法及代码示例
- Python pyspark DataFrame.add_prefix用法及代码示例
- Python pyspark DataFrame.all用法及代码示例
- Python pyspark DataFrame.add用法及代码示例
- Python pyspark DataFrame.axes用法及代码示例
- Python pyspark DataFrame.astype用法及代码示例
- Python pyspark DataFrame.aggregate用法及代码示例
- Python pyspark DataFrame.abs用法及代码示例
- Python pyspark DataFrame.agg用法及代码示例
- Python pyspark DataFrame.assign用法及代码示例
- Python pyspark DataFrame.at_time用法及代码示例
- Python pyspark DataFrame.add_suffix用法及代码示例
- Python pyspark DataFrame.to_latex用法及代码示例
- Python pyspark DataFrame.plot.bar用法及代码示例
- Python pyspark DataFrame.to_delta用法及代码示例
- Python pyspark DataFrame.quantile用法及代码示例
- Python pyspark DataFrame.cumsum用法及代码示例
- Python pyspark DataFrame.iloc用法及代码示例
- Python pyspark DataFrame.dropDuplicates用法及代码示例
- Python pyspark DataFrame.printSchema用法及代码示例
注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.pandas.DataFrame.apply。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。