将Koalas列中的列表拆分为多列。

3

如何从下面显示的df表到df1表?

df = koalas.DataFrame({"teams": [["SF", "NYG"] for _ in range(7)],'teams1':[np.random.randint(0,10) for _ in range(7)]})
df
output:
    teams   teams1
0   [SF, NYG]   0
1   [SF, NYG]   5
2   [SF, NYG]   8
3   [SF, NYG]   1
4   [SF, NYG]   2
5   [SF, NYG]   8
6   [SF, NYG]   5

df1 = koalas.DataFrame({"col1": ["SF" for _ in range(7)],\
                        "col2": ["NYG" for _ in range(7)],\
                        'teams1':[np.random.randint(0,10) for _ in range(7)]})
df1
output:
    col1 col2 teams1
0   SF  NYG 8
1   SF  NYG 2
2   SF  NYG 9
3   SF  NYG 4
4   SF  NYG 8
5   SF  NYG 3
6   SF  NYG 1

我在这里找到了一个 Pandas 的解决方案,链接在此。但这个方法会将所有数据都收集到驱动端,这并非我所期望的。我需要一个 Koalas(Pandas on PySpark) 的解决方案。


这个可能会有帮助:https://koalas.readthedocs.io/en/latest/user_guide/transform_apply.html - samkart
在Pyspark中做起来简单多了,你真的想要一个Koalas解决方案吗?Pyspark - new_sdf = kdf.to_spark().withColumn('col1', sdf.teams[0]).withColumn('col2', sdf.teams[1]) - samkart
是的,你说得对。我正在通过一种艰难的方式学习,就是我不能仅仅因为现在可以从pyspark导入pandas,就将我的pandas知识应用到pyspark中。在pandas上使用pyspark存在太多陷阱,而且对于所有用例来说,pyspark API会更容易。仍在学习 :) - figs_and_nuts
1个回答

1

我发现只使用操作工作器并不收集所有数据到驱动程序的函数的一种方法是

df['teams'] \
  .astype(str) \
  .str.replace('\[|\]', '') \
  .str.split(pat=',', n=1, expand=True)

#     0     1
# 0  SF   NYG
# 1  SF   NYG
# 2  SF   NYG
# 3  SF   NYG
# 4  SF   NYG
# 5  SF   NYG
# 6  SF   NYG

因为它是一个numpy数组,而pyspark无法操作它,所以我必须将该列转换为字符串类型。


要获取初始数据框及其其他列,可以使用简单的concat

import databricks.koalas as ks

ks.concat([
  df['teams'].astype(str).str.replace('\[|\]', '').str.split(pat=',', n=1, expand=True),
  df.drop(columns='teams')
], axis=1)

#     0     1  teams1
# 0  SF   NYG       2
# 1  SF   NYG       2
# 2  SF   NYG       1
# 3  SF   NYG       1
# 4  SF   NYG       7
# 5  SF   NYG       8
# 6  SF   NYG       6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接