Моя первоначальная идея состояла в том, чтобы объединить два столбца и создать один фрейм данных, который находится в структуре вашего вывода, а затем взять верхний 3. Я только что попробовал это в Scala, он должен работать и с pyspark.
val y = someDF.select("Tick", "Long").withColumn("type", lit("Long")).withColumnRenamed("Long", "PnL")
val z = someDF.select("Tick", "Short").withColumn("type", lit("Short")).withColumnRenamed("Short", "PnL")
println(y.union(z).sort(desc("PnL")).take(3))
Поскольку вы все делаете с помощью API API, я думаю, что это также должно дать вам хорошую производительность. Дайте мне знать, как это происходит!