【发布时间】:2019-06-14 09:56:48
【问题描述】:
我有一个 Pandas 数据框。我尝试先将包含字符串值的两列连接到一个列表中,然后使用 zip,我用“_”连接了列表的每个元素。我的数据集如下:
df['column_1']: 'abc, def, ghi'
df['column_2']: '1.0, 2.0, 3.0'
我想将这两列加入第三列,如下所示,用于我的数据框的每一行。
df['column_3']: [abc_1.0, def_2.0, ghi_3.0]
我已经使用下面的代码在 python 中成功完成了此操作,但是数据帧非常大,并且需要很长时间才能为整个数据帧运行它。为了提高效率,我想在 PySpark 中做同样的事情。我已成功读取 spark 数据框中的数据,但我很难确定如何使用 PySpark 等效函数复制 Pandas 函数。如何在 PySpark 中获得我想要的结果?
df['column_3'] = df['column_2']
for index, row in df.iterrows():
while index < 3:
if isinstance(row['column_1'], str):
row['column_1'] = list(row['column_1'].split(','))
row['column_2'] = list(row['column_2'].split(','))
row['column_3'] = ['_'.join(map(str, i)) for i in zip(list(row['column_1']), list(row['column_2']))]
我已使用以下代码将两列转换为 PySpark 中的数组
from pyspark.sql.types import ArrayType, IntegerType, StringType
from pyspark.sql.functions import col, split
crash.withColumn("column_1",
split(col("column_1"), ",\s*").cast(ArrayType(StringType())).alias("column_1")
)
crash.withColumn("column_2",
split(col("column_2"), ",\s*").cast(ArrayType(StringType())).alias("column_2")
)
现在我只需要使用“_”压缩两列中数组的每个元素。我该如何使用 zip 呢?任何帮助表示赞赏。
【问题讨论】:
-
为什么
df['column_1']和df['column_2']是单个字符串而不是项目列表?它们最初是什么? -
数据是这样的,我正在数据框中读取数据
-
@Falconic 所以
abc,def等在单行或不同行?同样是第 2 列单行? -
@anky_91 这是 column_1 和 column_2 的一行数据框。每行在一列中有多个项目。这就是我拆分字符串然后转换为列表的原因。
标签: python pandas apache-spark pyspark apache-spark-sql