Вы можете объединить все столбцы от Alpha до Foxtrot, чтобы создать фрейм данных с тремя столбцами (числовое значение, столбец переменной, имя столбца значения). Пожалуйста, посмотрите на приведенный ниже пример:
import random
#creating a dataframe similiar to yours
columns = ['A','B','C','D','E','F']
l = [[random.random() if c!=r else None for c in range(6)] for r in range(6)]
l = [x + [columns[i]] for i,x in enumerate(l)]
df=spark.createDataFrame(l, columns)
df.show()
Выход:
+-------------------+--------------------+--------------------+--------------------+-------------------+-------------------+---+
| A| B| C| D| E| F| _7|
+-------------------+--------------------+--------------------+--------------------+-------------------+-------------------+---+
| null| 0.37958341713258026| 0.31880755415785833| 0.8908555547489883|0.41632799280431776| 0.0729721304772899| A|
|0.21814744903713268| null|0.024393462170815394| 0.9940573571339111| 0.7841527980918188| 0.194722179975509| B|
| 0.786507586894131| 0.9155528558183477| null| 0.5782381547037391| 0.9714912596343181| 0.5446460767903856| C|
| 0.9108497603580163| 0.5088891113970719| 0.35594300627798736| null| 0.514258802933162|0.19317616393798986| D|
| 0.193214269992123| 0.6259176088252493| 0.4425532657461867|0.050484163355697276| null| 0.6594661109179668| E|
| 0.5567272189587709|0.020606558131312402| 0.21905184240270814| 0.2817064382900445| 0.5409619970394691| null| F|
+-------------------+--------------------+--------------------+--------------------+-------------------+-------------------+---+
import pyspark.sql.functions as F
newdf = df.select(F.col('A').alias('value'), F.col('_7').alias('row'), F.lit('A').alias('column'))
for col in columns[1:]:
newdf = newdf.union(df.select(col, '_7', F.lit(col)))
newdf.orderBy(newdf.value.desc()).show(3)
Выход:
+------------------+---+------+
| value|row|column|
+------------------+---+------+
|0.9940573571339111| B| D|
|0.9714912596343181| C| E|
|0.9155528558183477| C| B|
+------------------+---+------+