如何在 PySpark Dataframe 的特定位置添加多个空列

5

我尝试过很多研究,但是我无法找到一种在特定位置执行和添加多个列到PySpark Dataframe的方法。

我有一个看起来像这样的数据框:

Customer_id   First_Name   Last_Name  

我想在三个不同的位置添加3个空列,我的最终数据框应该是这样的:
``` Customer_id Address First_Name Email_address Last_Name Phone_no ```
有没有简单的方法可以实现,就像Python中的`reindex`一样?

reindex 和列的顺序有什么关系?在这里查看 reindex。据我所知,你想按照以下顺序添加三列: Customer_id Address First_Name Email_address Last_Name Phone_no,对吗? - cph_sto
是的!我的意思是,使用reindex,我可以定义所有列,包括我想要创建的列,并将它们按照必要的顺序排列。 - Manas Jani
没问题。但是使用reindex命令可以重新排列行而不是列 - 这只是为了明确事情的真相。在Python中,reindexing有一个定义,它并不是你所要求的内容。 - cph_sto
2个回答

13
# Creating a DataFrame.
from pyspark.sql.functions import col, lit
df = sqlContext.createDataFrame(
    [('1','Moritz','Schulz'),('2','Sandra','Schröder')],
     ('Customer_id','First_Name','Last_Name')
)
df.show()
+-----------+----------+---------+
|Customer_id|First_Name|Last_Name|
+-----------+----------+---------+
|          1|    Moritz|   Schulz|
|          2|    Sandra| Schröder|
+-----------+----------+---------+

您可以使用lit()函数添加空列,一旦创建好,您可以使用SQL的select来按您想要的顺序重新排列列。

df = df.withColumn('Address',lit(''))\
       .withColumn('Email_address',lit(''))\
       .withColumn('Phone_no',lit(''))\
       .select( 
           'Customer_id', 'Address', 'First_Name',
           'Email_address', 'Last_Name', 'Phone_no'
       )
df.show()
+-----------+-------+----------+-------------+---------+--------+
|Customer_id|Address|First_Name|Email_address|Last_Name|Phone_no|
+-----------+-------+----------+-------------+---------+--------+
|          1|       |    Moritz|             |   Schulz|        |
|          2|       |    Sandra|             | Schröder|        |
+-----------+-------+----------+-------------+---------+--------+

如用户@Pault所建议的那样,更简明扼要的方式是 -

df = df.select(
    "Customer_id", lit('').alias("Address"), "First_Name",
    lit("").alias("Email_address"), "Last_Name", lit("").alias("Phone_no")
)
df.show()
+-----------+-------+----------+-------------+---------+--------+
|Customer_id|Address|First_Name|Email_address|Last_Name|Phone_no|
+-----------+-------+----------+-------------+---------+--------+
|          1|       |    Moritz|             |   Schulz|        |
|          2|       |    Sandra|             | Schröder|        |
+-----------+-------+----------+-------------+---------+--------+

好的,谢谢!我刚刚做了同样的事情...只是我将选择语句单独执行了!我的意思是,在使用 withColumns 生成所有列后,在新的数据框中执行选择语句。 - Manas Jani
7
这里不需要用 withColumn,可以直接使用 selectdf = df.select("Customer_id", lit('').alias("Address"), "First_Name", lit("").alias("Email_address"), "Last_Name", lit("").alias("Phone_no")) - pault

7

如果你想更加简洁,我感觉可以更短:

for col in ["mycol1", "mycol2", "mycol3", "mycol4", "mycol5", "mycol6"]:
    df = df.withColumn(col, F.lit(None))

你可以选择相同的数组进行排序。
(编辑)注意:在for循环中使用withColumn通常会很慢。不要在高数量的列中这样做,最好使用select语句,例如:
select_statement = []
for col in ["mycol1", "mycol2", "mycol3", "mycol4", "mycol5", "mycol6"]:
    select_statement.append(F.lit(None).alias(col))
df = df.select(*df.columns, *select_statement)

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