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


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


本文简要介绍 pyspark.pandas.groupby.GroupBy.apply 的用法。

用法:

GroupBy.apply(func: Callable, *args: Any, **kwargs: Any) → Union[pyspark.pandas.frame.DataFrame, pyspark.pandas.series.Series]

逐组应用函数 func 并将结果组合在一起。

传递给 apply 的函数必须采用 DataFrame 作为其第一个参数并返回一个 DataFrame。然后apply 将负责将结果组合回单个数据帧。因此,apply 是一种高度灵活的分组方法。

虽然 apply 是一种非常灵活的方法,但它的缺点是使用它可能比使用更具体的方法(如 aggtransform )慢很多。 pandas-on-Spark 提供了广泛的方法,这些方法比使用 apply 用于特定目的要快得多,因此在达到 apply 之前尝试使用它们。

注意

此 API 执行该函数一次以推断可能昂贵的类型,例如,在聚合或排序后创建数据集时。

为避免这种情况,请在 func 中指定返回类型,例如,如下所示:

>>> def pandas_div(x) -> ps.DataFrame[float, float]:
...     return x[['B', 'C']] / x[['B', 'C']]

如果指定返回类型,则输出列名称变为 c0, c1, c2 … cn 。这些名称按位置映射到 func 中返回的 DataFrame 。

要指定列名,您可以使用 pandas 友好的样式指定它们,如下所示:

>>> def pandas_div(x) -> ps.DataFrame["a": float, "b": float]:
...     return x[['B', 'C']] / x[['B', 'C']]
>>> pdf = pd.DataFrame({'B': [1.], 'C': [3.]})
>>> def plus_one(x) -> ps.DataFrame[zip(pdf.columns, pdf.dtypes)]:
...     return x[['B', 'C']] / x[['B', 'C']]

当给定函数注释了返回类型时,GroupBy 对象的原始索引将丢失,并且默认索引将附加到结果中。请谨慎配置默认索引。另请参阅Default Index Type

注意

func 中的 DataFrame 实际上是 Pandas DataFrame 。因此,允许在此函数中使用任何 pandas API。

参数

func可调用的

一个可调用函数,将 DataFrame 作为其第一个参数,并返回一个数据帧。

*args

要传递给 func 的位置参数。

**kwargs

要传递给 func 的关键字参数。

返回

appliedDataFrame 或系列

例子

>>> df = ps.DataFrame({'A': 'a a b'.split(),
...                    'B': [1, 2, 3],
...                    'C': [4, 6, 5]}, columns=['A', 'B', 'C'])
>>> g = df.groupby('A')

请注意,g 有两个组,ab。通过各种方式调用apply,可以得到不同的分组结果:

下面传递给 apply 的函数采用 DataFrame 作为参数并返回 DataFrame。 apply 将每个组的结果组合到一个新的 DataFrame 中:

>>> def plus_min(x):
...     return x + x.min()
>>> g.apply(plus_min).sort_index()  
    A  B   C
0  aa  2   8
1  aa  3  10
2  bb  6  10
>>> g.apply(sum).sort_index()  
    A  B   C
A
a  aa  3  10
b   b  3   5
>>> g.apply(len).sort_index()  
A
a    2
b    1
dtype: int64

您可以指定类型提示并防止模式推断以获得更好的性能。

>>> def pandas_div(x) -> ps.DataFrame[float, float]:
...     return x[['B', 'C']] / x[['B', 'C']]
>>> g.apply(pandas_div).sort_index()  
    c0   c1
0  1.0  1.0
1  1.0  1.0
2  1.0  1.0

在系列的情况下,它的工作原理如下。

>>> def plus_max(x) -> ps.Series[np.int]:
...     return x + x.max()
>>> df.B.groupby(df.A).apply(plus_max).sort_index()  
0    6
1    3
2    4
Name: B, dtype: int64
>>> def plus_min(x):
...     return x + x.min()
>>> df.B.groupby(df.A).apply(plus_min).sort_index()
0    2
1    3
2    6
Name: B, dtype: int64

您还可以返回一个标量值作为组的聚合值:

>>> def plus_length(x) -> np.int:
...     return len(x)
>>> df.B.groupby(df.A).apply(plus_length).sort_index()  
0    1
1    2
Name: B, dtype: int64

函数的额外参数可以如下传递。

>>> def calculation(x, y, z) -> np.int:
...     return len(x) + y * z
>>> df.B.groupby(df.A).apply(calculation, 5, z=10).sort_index()  
0    51
1    52
Name: B, dtype: int64

相关用法


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