3

我正在尝试将一些代码从 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()
    })
)

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

我只有几个问题:

  1. 这个错误是否意味着我的方法将来会被弃用? /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.

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

  3. 正如您所注意到的,我不得不调用 pd.Series ——有没有办法在考拉中做到这一点?调用 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.

感谢您提供的任何帮助!

4

1 回答 1

1
  1. 我不确定这个错误。我正在使用koalas==1.2.0并且pandas==1.0.5我没有收到错误,所以我不会担心
  2. 这些groupby列已经被调用A并且B当我运行代码时。这可能又是一个已被修补的错误。
  3. 为此,您有 3 个选项:
    1. 继续利用pd.Series。只要您的原始数据框是koalas数据框,您的输出也将是koalas数据框(pd.Series自动转换为ks.Series
    2. 保持函数和数据完全相同,只需将最终数据帧转换为koalas使用from_pandas函数
    3. 做整个事情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())
于 2020-10-08T00:05:50.047 回答