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.0
和pandas==1.0.5
,我没有收到错误,所以我不会担心
当我运行代码时,groupby
列已经被称为 A
和 B
。这可能又是一个已修复的错误。
为此,您有 3 个选项:
-
继续使用
pd.Series
。只要您的原始数据框是koalas
数据框,您的输出也将是koalas
数据框(pd.Series
自动转换为ks.Series
)
保持函数和数据完全相同,只需使用from_pandas
函数将最终数据帧转换为koalas
在koalas
中完成所有工作。这有点棘手,因为您正在计算基于两个 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 > 系列的主要内容,如果未能解决你的问题,请参考以下文章
使用带有参数的 Pandas groupby() + apply()