Преобразование строк в столбцы в файле данных pyspark

#python #apache-spark #pyspark

Вопрос:

Мой текущий фрейм данных pyspark выглядит следующим образом:

 Region Location Month Services Type values_in_millions values_in_percent USA USA 1/1/2021 ABC DC 101537.553 34.775 Europe Italy 2/1/2021 ABC DC 434404.87 44.653 Europe Spain 2/1/2021 ABC DC 895057.332 21.925 Asia India 3/1/2021 ABC DC 211963.21 27.014  

Мой желаемый фрейм данных должен быть в этой форме:

 Region Location Month Services Type key_1 values_1 values_2 USA USA 1/1/2021 ABC DC values_in_millions 101537.553  Europe Italy 2/1/2021 ABC DC values_in_millions 434404.87  Europe Spain 2/1/2021 ABC DC values_in_millions 895057.332  Asia India 3/1/2021 ABC DC values_in_millions 211963.21 USA USA 1/1/2021 ABC DC values_in_percent 34.775% Europe Italy 2/1/2021 ABC DC values_in_percent 44.653% Europe Spain 2/1/2021 ABC DC values_in_percent 21.925% Asia India 3/1/2021 ABC DC values_in_percent 27.014%  

Любые подходы помогут..

Ответ №1:

Вы можете создать 2 отдельных фрейма данных. df1 — это с помощью key_1 = ‘value_in_millions’, а df2-с помощью key_1 = ‘value_in_percent’. То, что я делаю ниже, — это сначала выбираю необходимые столбцы, жестко кодирую значения в столбце key_1, жестко кодирую столбцы «values_1» и «values_2» и, наконец, повторно выбираю столбцы, чтобы они были расположены в том же порядке.

 from pyspark.sql.functions import lit  df1 = df.select("Region","Location","Month","Services","Type","value_in_millions").withColumn("key_1",lit("value_in_millions")).withColumn("values_2",lit("")).withColumnRenamed("value_in_millions", "values_1").select("Region","Location","Month","Services","Type","key_1","values_1","values_2") df2 = df.select("Region","Location","Month","Services","Type","value_in_percent").withColumn("key_1",lit("value_in_percent")).withColumn("values_1",lit("")).withColumnRenamed("value_in_percent", "values_2").select("Region","Location","Month","Services","Type","key_1","values_1","values_2")  df1.show() df2.show()  

Выходные данные приведены ниже.

  ------ -------- ---------- -------- ---- ----------------- -------- --------  |Region|Location| Month|Services|Type| key_1|values_1|values_2|  ------ -------- ---------- -------- ---- ----------------- -------- --------  | USA| USA|2001-01-01| ABC| DC|value_in_millions| 100000| | | IND| DLH|2001-01-01| ABC| DC|value_in_millions| 200000| | | NYC| NYC|2001-01-01| ABC| DC|value_in_millions| 300000| | | UK| WALES|2001-01-01| ABC| DC|value_in_millions| 400000| |  ------ -------- ---------- -------- ---- ----------------- -------- --------    ------ -------- ---------- -------- ---- ---------------- -------- --------  |Region|Location| Month|Services|Type| key_1|values_1|values_2|  ------ -------- ---------- -------- ---- ---------------- -------- --------  | USA| USA|2001-01-01| ABC| DC|value_in_percent| | 34| | IND| DLH|2001-01-01| ABC| DC|value_in_percent| | 35| | NYC| NYC|2001-01-01| ABC| DC|value_in_percent| | 36| | UK| WALES|2001-01-01| ABC| DC|value_in_percent| | 37|  ------ -------- ---------- -------- ---- ---------------- -------- --------   

Как только они будут переупорядочены в том же порядке, я смогу объединить 2 кадра данных.

 from functools import reduce # For Python 3.x from pyspark.sql import DataFrame   def unionAll(*dfs):  return reduce(DataFrame.unionAll, dfs)   df3 = unionAll(df1, df2) df3.show()  

Вывод приведен ниже.

  ------ -------- ---------- -------- ---- ----------- -------- --------  |Region|Location| Month|Services|Type| key1|values_1|values_2|  ------ -------- ---------- -------- ---- ----------- -------- --------  | USA| USA|2001-01-01| ABC| DC|valueinmill| 100000| | | IND| DLH|2001-01-01| ABC| DC|valueinmill| 200000| | | NYC| NYC|2001-01-01| ABC| DC|valueinmill| 300000| | | UK| WALES|2001-01-01| ABC| DC|valueinmill| 400000| | | USA| USA|2001-01-01| ABC| DC| valueinpct| | 34| | IND| DLH|2001-01-01| ABC| DC| valueinpct| | 35| | NYC| NYC|2001-01-01| ABC| DC| valueinpct| | 36| | UK| WALES|2001-01-01| ABC| DC| valueinpct| | 37|  ------ -------- ---------- -------- ---- ----------- -------- --------