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
是一种非常灵活的方法,但它的缺点是使用它可能比使用更具体的方法(如agg
或transform
)慢很多。 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 的关键字参数。
- applied:DataFrame 或系列
参数:
返回:
例子:
>>> 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
有两个组,a
和b
。通过各种方式调用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
相关用法
- Python pyspark GroupBy.any用法及代码示例
- Python pyspark GroupBy.all用法及代码示例
- Python pyspark GroupBy.mean用法及代码示例
- Python pyspark GroupBy.head用法及代码示例
- Python pyspark GroupBy.cumsum用法及代码示例
- Python pyspark GroupBy.rank用法及代码示例
- Python pyspark GroupBy.bfill用法及代码示例
- Python pyspark GroupBy.cummin用法及代码示例
- Python pyspark GroupBy.cummax用法及代码示例
- Python pyspark GroupBy.fillna用法及代码示例
- Python pyspark GroupBy.diff用法及代码示例
- Python pyspark GroupBy.filter用法及代码示例
- Python pyspark GroupBy.transform用法及代码示例
- Python pyspark GroupBy.cumcount用法及代码示例
- Python pyspark GroupBy.idxmax用法及代码示例
- Python pyspark GroupBy.shift用法及代码示例
- Python pyspark GroupBy.idxmin用法及代码示例
- Python pyspark GroupBy.nunique用法及代码示例
- Python pyspark GroupBy.median用法及代码示例
- Python pyspark GroupBy.tail用法及代码示例
- Python pyspark GroupBy.size用法及代码示例
- Python pyspark GroupBy.get_group用法及代码示例
- Python pyspark GroupBy.ffill用法及代码示例
- Python pyspark GroupBy.backfill用法及代码示例
- Python pyspark GroupBy.cumprod用法及代码示例
注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.pandas.groupby.GroupBy.apply。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。