Python 在Dataframe列中取消嵌套数据拆分

Python 在Dataframe列中取消嵌套数据拆分,python,pyspark,Python,Pyspark,我有一个数据框,有4列,第一列是键,第四列是值。但有时键可以有一个变量,在这种情况下,第一列为空,键及其变量分别存储在第二列和第三列中 如何转换数据帧,使其只有两列:键和值 比如说,我正在为我的用户构建一个居住数据框架,我收到了下表: 从pyspark.sql导入行 l=[(“乔”、“伦敦”、“伦敦”), (“爱丽丝”、“鲍勃”、“巴黎”), (“莎拉”,“纽约”), (“约翰”、“埃德蒙”、“柏林”)] rdd=sc.并行化(l) people=rdd.map(lambda x:Row(sin

我有一个数据框,有4列,第一列是键,第四列是值。但有时键可以有一个变量,在这种情况下,第一列为空,键及其变量分别存储在第二列和第三列中

如何转换数据帧,使其只有两列:键和值

比如说,我正在为我的用户构建一个居住数据框架,我收到了下表:

从pyspark.sql导入行
l=[(“乔”、“伦敦”、“伦敦”),
(“爱丽丝”、“鲍勃”、“巴黎”),
(“莎拉”,“纽约”),
(“约翰”、“埃德蒙”、“柏林”)]
rdd=sc.并行化(l)
people=rdd.map(lambda x:Row(single=x[0],partner1=x[1],partner2=x[2],town=x[3]))
schemaPeople=sqlContext.createDataFrame(人)
schemaPeople.show()
+--------+--------+------+--------+
|合伙人1 |合伙人2 |单身|城镇|
+--------+--------+------+--------+
|| |乔|伦敦|
|爱丽丝|鲍勃|巴黎|
|| |莎拉|纽约|
|约翰·埃德蒙·柏林|
+--------+--------+------+--------+
如何将其转换为:

 +--------+--------+
 |   name | town   | 
 +--------+--------+
 | Joe    | London | 
 | Alice  | Paris  | 
 | Bob    | Paris  | 
 | Sarah  |New-York| 
 | John   | Berlin | 
 | Edmund | Berlin |
 +--------+--------+

我可以想出一种方法,使用
concat\uws
将人员连接起来,然后
split
it。然后
分解
结果以获得表格

schpeep = schemaPeople. \
    select('town', func.split(func.concat_ws('|', 'partner1', 'partner2', 'single'), '\|').alias('people')). \
    withColumn('name', func.explode('people')). \
    drop('people'). \
    filter(func.col('name') != '')

schpeeps.show()

+--------+------+
|    town|  name|
+--------+------+
|  London|   Joe|
|   Paris| Alice|
|   Paris|   Bob|
|New-York| Sarah|
|  Berlin|  John|
|  Berlin|Edmund|
+--------+------+

我可以想出一种方法,使用
concat\uws
将人员连接起来,然后
split
it。然后
分解
结果以获得表格

schpeep = schemaPeople. \
    select('town', func.split(func.concat_ws('|', 'partner1', 'partner2', 'single'), '\|').alias('people')). \
    withColumn('name', func.explode('people')). \
    drop('people'). \
    filter(func.col('name') != '')

schpeeps.show()

+--------+------+
|    town|  name|
+--------+------+
|  London|   Joe|
|   Paris| Alice|
|   Paris|   Bob|
|New-York| Sarah|
|  Berlin|  John|
|  Berlin|Edmund|
+--------+------+

您只需执行
union
s即可

df.select(
F.col(“合伙人1”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)\
.工会(
选择(
F.col(“合伙人2”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)
)\
.工会(
选择(
F.col(“单一”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)
)

您只需执行
union
s

df.select(
F.col(“合伙人1”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)\
.工会(
选择(
F.col(“合伙人2”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)
)\
.工会(
选择(
F.col(“单一”)。别名(“名称”),
F.col(“城镇”)
)。其中(“名称”)
)

太棒了!我接受你的回答,因为前几天你花时间帮助我!非常感谢:)太好了!我接受你的回答,因为前几天你花时间帮助我!非常感谢:)很好的回答,谢谢,我发现史蒂文的更容易理解。很好的回答,谢谢,我发现史蒂文的更容易理解。