首页 > 解决方案 > 如何使用 Pyspark 中映射表中的值重命名 DataFrame 标头

问题描述

我必须使用 Pyspark 中映射表(下面的 df2)中的值重命名表()的列。

谢谢你的帮助!

我试着用熊猫来做,但它在我的桌子上工作了 25 分钟。

import pandas as pd
df = pd.DataFrame({'kod':[1,1,3,4,5], 'freq':[4,8,8,20,16], 'lsv':[100,200,300,250,400]}) 

df2 = pd.DataFrame({'oldid':['kod','freq','lsv'], 'newid':['code','visits','volume']}) 

mapping=dict(df2[['oldid', 'newid']].values) 
df=df.rename(columns=mapping)  

display(df2)

标签: pythonapache-sparkpyspark

解决方案


将 Pandas 数据帧转换为 Spark 数据帧后,Spark Dataframes 的工作方式与 Pandas 数据帧几乎没有区别

我将名称更新freqzeq只是为了演示排序

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|
+---+---+---+

标头数据帧

headers = spark.createDataFrame([('code','kod'),('visits','zeq'),('volume','lsv')],['newid','oldid'])
headers.show()
+------+-----+
| newid|oldid|
+------+-----+
|  code|  kod|
|visits|  zeq|
|volume|  lsv|
+------+-----+

Spark 数据帧上有一个名为toDFavailable 的方法,它将新标题列的列表作为参数并更新数据帧的标题。

因此,根据 oldid 对数据框进行排序并选择新 id 并将该列值转换为如下列表

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|
+----+------+------+

如果您需要更多详细信息,请告诉我


推荐阅读