Koalas GroupBy > Apply > Lambda > 系列

Posted

技术标签:

【中文标题】Koalas GroupBy > Apply > Lambda > 系列【英文标题】:Koalas GroupBy > Apply > Lambda > Series 【发布时间】:2020-10-26 21:28:46 【问题描述】:

我正在尝试将一些代码从 Pandas 移植到 Koala,以利用 Spark 的分布式处理。我正在获取一个数据框并将其分组到 A 和 B 上,然后应用一系列函数来填充新数据框的列。这是我在 Pandas 中使用的代码:

new = old.groupby(['A', 'B']) \
  .apply(lambda x: pd.Series(
    'v1': x['v1'].sum(),
    'v2': x['v2'].sum(),
    'v3': (x['v1'].sum() / x['v2'].sum()),
    'v4': x['v4'].min()
    )
)

我相信它运行良好,并且生成的数据框在价值方面似乎是正确的。

我只有几个问题:

    这个错误是否意味着我的方法将来会被弃用? /databricks/spark/python/pyspark/sql/pandas/group_ops.py:76: UserWarning: It is preferred to use 'applyInPandas' over this API. This API will be deprecated in the future releases. See SPARK-28264 for more details.

    如何将分组列重命名为“A”和“B”而不是 "__groupkey_0__ __groupkey_1__"?

    正如您所注意到的,我必须调用 pd.Series —— 有没有办法在 Koalas 中做到这一点?调用 ks.Series 给我以下错误,我不确定如何实现: PandasNotImplementedError: The method `pd.Series.__iter__()` is not implemented. If you want to collect your data as an NumPy array, use 'to_numpy()' instead.

感谢您提供的任何帮助!

【问题讨论】:

【参考方案1】:
    我不确定这个错误。我正在使用koalas==1.2.0pandas==1.0.5,我没有收到错误,所以我不会担心 当我运行代码时,groupby 列已经被称为 AB。这可能又是一个已修复的错误。 为此,您有 3 个选项:
      继续使用pd.Series。只要您的原始数据框是koalas 数据框,您的输出也将是koalas 数据框(pd.Series 自动转换为ks.Series) 保持函数和数据完全相同,只需使用from_pandas函数将最终数据帧转换为koalaskoalas 中完成所有工作。这有点棘手,因为您正在计算基于两个 GroupBy 列的聚合列,而 koalas 不支持将 lambda 函数作为有效聚合。我们可以解决这个问题的一种方法是一起计算其他聚合,然后添加多列聚合:
import databricks.koalas as ks
ks.set_option('compute.ops_on_diff_frames', True)

# Dummy data
old = ks.DataFrame("A":[1,2,3,1,2,3], "B":[1,2,3,3,2,3], "v1":[10,20,30,40,50,60], "v2":[4,5,6,7,8,9], "v4":[0,0,1,1,2,2])

new = old.groupby(['A', 'B']).agg('v1':'sum', 'v2':'sum', 'v4': 'min')
new['v3'] = old.groupby(['A', 'B']).apply(lambda x: x['v1'].sum() / x['v2'].sum())

【讨论】:

以上是关于Koalas GroupBy > Apply > Lambda > 系列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:GroupBy .pipe() 与 .apply()

使用带有参数的 Pandas groupby() + apply()

groupby+(apply+agg+transform)方法的比较

pandas groupby apply 真的很慢

熊猫 groupby.apply 到 pyspark

一次在多列上使用 pandas groupby().apply(list) [重复]