我正在尝试将一些代码从 Pandas 移植到 Koalas 以利用 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()
})
)
我相信它运行良好,并且生成的数据框在值(value)方面似乎是正确的。
我有几个问题:
此错误是否意味着我的方法将来会被弃用?
/databricks/spark/python/pyspark/sql/pandas/group_ops.py:76: UserWarning: 最好在此 API 上使用“applyInPandas”。此 API 将在未来版本中弃用。有关详细信息,请参阅 SPARK-28264。
如何将分组依据列重命名为“A”和“B”而不是
“__groupkey_0__ __groupkey_1__”?
正如您所注意到的,我不得不调用 pd.Series —— 有没有办法在 Koalas 中执行此操作?调用 ks.Series 会出现以下错误,我不确定如何实现:
PandasNotImplementedError:方法 `pd.Series.__iter__()` 未实现。如果您想将数据收集为 NumPy 数组,请改用“to_numpy()”。
感谢您提供的任何帮助!
最佳答案
- 我不确定这个错误。我正在使用
koalas==1.2.0
和pandas==1.0.5
并且我没有收到错误所以我不会担心它 - 当我运行代码时,
groupby
列已经被称为A
和B
。这可能又是一个错误,此后已被修补。 - 为此,您有 3 个选择:
- 继续使用
pd.Series
。只要您的原始 Dataframe 是koalas
Dataframe,您的输出也将是koalas
Dataframe(pd.Series
自动转换为ks.系列
) - 保持函数和数据完全相同,并使用
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())
关于pandas - Koalas GroupBy > 应用 > Lambda > 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62761435/