当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python pyspark DataFrame.apply用法及代码示例


本文简要介绍 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

相关用法


注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.pandas.DataFrame.apply。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。