Python 如何使用Pyspark中映射表中的值重命名DataFrame标头
我必须使用Pyspark中映射表(下面的df2)中的值重命名table()的列 谢谢你的帮助 我试着用熊猫做这个,但用我的桌子可以用25分钟。Python 如何使用Pyspark中映射表中的值重命名DataFrame标头,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我必须使用Pyspark中映射表(下面的df2)中的值重命名table()的列 谢谢你的帮助 我试着用熊猫做这个,但用我的桌子可以用25分钟。 将熊猫作为pd导入 数据帧({'kod':[1,1,3,4,5],'freq':[4,8,8,20,16],'lsv':[100200300250400]) df2=pd.DataFrame({'oldid':['kod','freq','lsv'],'newid':['code','visions','volume']}) mapping=dict(d
将熊猫作为pd导入
数据帧({'kod':[1,1,3,4,5],'freq':[4,8,8,20,16],'lsv':[100200300250400])
df2=pd.DataFrame({'oldid':['kod','freq','lsv'],'newid':['code','visions','volume']})
mapping=dict(df2['oldid','newid']].值)
df=df.rename(列=映射)
显示器(df2)
Spark数据帧与Pandas数据帧的工作原理几乎没有什么不同
将pandas数据帧转换为Spark数据帧后
我正在将freq
的名称更新为zeq
,只是为了演示排序
df = spark.createDataFrame([(4,1,100),(8,1,200),(8,3,300),(20,4,250),(16,5,400)], ['zeq','kod','lsv'])
sorted_df = df.select(sorted(df.columns))
sorted_df.show()
+---+---+---+
|kod|lsv|zeq|
+---+---+---+
| 1|100| 4|
| 1|200| 8|
| 3|300| 8|
| 4|250| 20|
| 5|400| 16|
+---+---+---+
报头数据帧
Spark dataframe上提供了一个名为toDF
的方法,该方法将新标题列列表作为参数,并更新dataframe的标题
所以,根据旧id对数据框进行排序,选择新id,并将该列值转换为如下列表
使用新标题更新数据帧
如果您需要更多详细信息,请告诉我,但有一点情况是,第一个表中列名的水平顺序和第二个表中新名称的垂直顺序应该相同。在我的示例中,它在第一个表中是[| freq | kod | lsv |],在映射表中是完全不同的顺序。如果有什么方法可以用dict重命名列?@peterthepi我已经用你更新的查询更新了答案。谢谢Suresh,我喜欢这个决定,它非常优雅。非常感谢你!很高兴它起了作用:)它起了很大的作用!谢谢:)
headers = spark.createDataFrame([('code','kod'),('visits','zeq'),('volume','lsv')],['newid','oldid'])
headers.show()
+------+-----+
| newid|oldid|
+------+-----+
| code| kod|
|visits| zeq|
|volume| lsv|
+------+-----+
sorted_headers_list = headers.sort('oldid').select('newid').rdd.flatMap(lambda x: x).collect()
df_with_updated_headers = sorted_df.toDF(*sorted_headers_list)
df_with_updated_headers.show()
+----+------+------+
|code|volume|visits|
+----+------+------+
| 1| 100| 4|
| 1| 200| 8|
| 3| 300| 8|
| 4| 250| 20|
| 5| 400| 16|
+----+------+------+