我有一个字符串元素列表,大约有17k个元素。我必须在数据框中创建新列,其中包含整数0作为其所有元素,列应具有列表中存在的元素的名称。
我该怎么做?
示例列表
['V1045','71752','31231']
所需格式:
ID V1045 71752 31231
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
数据框有大约700,000行。
答案 0 :(得分:1)
您可以轻松生成该数据:
此列表将用于列名称:
l = ['ID', 'V1045','71752','31231']
然后创建具有所需索引的范围,并将静态零用作值:
df = sc.parallelize(range(700000))\
.map(lambda l: [l, 0, 0, 0])\
.toDF(l)
当您致电.show()
时,会返回如下内容:
+---+-----+-----+-----+
| ID|V1045|71752|31231|
+---+-----+-----+-----+
| 0| 0| 0| 0|
| 1| 0| 0| 0|
| 2| 0| 0| 0|
| 3| 0| 0| 0|
| 4| 0| 0| 0|
+---+-----+-----+-----+
only showing top 5 rows
答案 1 :(得分:0)
如果您已有数据框,添加列的最简单方法是使用withColumn()
。您可以使用pyspark.sql.functions.lit()
将值0
添加到每一行。
例如:
l = ['V1045','71752','31231']
for new_col in l:
df = df.withColumn(new_col, f.lit(0))
df.show(n=5)
#+---+-----+-----+-----+
#| ID|V1045|71752|31231|
#+---+-----+-----+-----+
#| 0| 0| 0| 0|
#| 1| 0| 0| 0|
#| 2| 0| 0| 0|
#| 3| 0| 0| 0|
#| 4| 0| 0| 0|
#+---+-----+-----+-----+
#only showing top 5 rows
请记住,spark是懒惰的,因此这些操作不会在循环中发生,如此处所示。
df.explain()
#== Physical Plan ==
#*Project [ID#111L, 0 AS V1045#114, 0 AS 71752#118, 0 AS 31231#123]
#+- Scan ExistingRDD[ID#111L]
您可能不应该使用sc.parallelize(range())
,特别是如果您按照this post中的说明使用python 2。