データフレームがあり、各行で最大 5 つの値を見つけ、それらの値のみを 1 に変換し、データフレーム構造を維持しながらすべてを 0 に変換する必要があります。つまり、列名は同じままにする必要があります。
toLocalIterator を使用してから、各行をリストに変換してから、上位 5 を値 1 に変換しようとしましたが、大きなデータセットでコードを実行すると java.lang.outOfMemoryError が発生します。ログを見ていると、推奨される最大サイズが 100KB であるのに、非常に大きなサイズ (約 25000KB) のタスクが送信されていることがわかりました。
上位 5 つの値を見つけて特定の値 (この場合は 1) に変換し、残りをすべて 0 にするより良い方法はありますか?
編集1:
たとえば、入力としてこの10列と5行がある場合
+----+----+----+----+----+----+----+----+----+----+
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|
+----+----+----+----+----+----+----+----+----+----+
|0.74| 0.9|0.52|0.85|0.18|0.23| 0.3| 0.0| 0.1|0.07|
|0.11|0.57|0.81|0.81|0.45|0.48|0.86|0.38|0.41|0.45|
|0.03|0.84|0.17|0.96|0.09|0.73|0.25|0.05|0.57|0.66|
| 0.8|0.94|0.06|0.44| 0.2|0.89| 0.9| 1.0|0.48|0.14|
|0.73|0.86|0.68| 1.0|0.78|0.17|0.11|0.19|0.18|0.83|
+----+----+----+----+----+----+----+----+----+----+
これは私が出力として欲しいものです
+---+---+---+---+---+---+---+---+---+---+
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|
+---+---+---+---+---+---+---+---+---+---+
| 1| 1| 1| 1| 0| 0| 1| 0| 0| 0|
| 0| 1| 1| 1| 0| 1| 1| 0| 0| 0|
| 0| 1| 0| 1| 0| 1| 0| 0| 1| 1|
| 1| 1| 0| 0| 0| 1| 1| 1| 0| 0|
| 1| 1| 0| 1| 1| 0| 0| 0| 0| 1|
+---+---+---+---+---+---+---+---+---+---+
ご覧のとおり、行と列の構造を維持しながら、各行の上位 (最大) 5 つの値を見つけて、それらを 1 に変換し、残りの値を 0 に変換します。
これは私が使用しているものです(outOfMemoryErrorが発生します)
for row in prob_df.rdd.toLocalIterator():
rowPredDict = {}
for cat in categories:
rowPredDict[cat]= row[cat]
sorted_row = sorted(rowPredDict.items(), key=lambda kv: kv[1],reverse=True)
#print(rowPredDict)
rowPredDict = rowPredDict.fromkeys(rowPredDict,0)
rowPredDict[sorted_row[0:5][0][0]] = 1
rowPredDict[sorted_row[0:5][1][0]] = 1
rowPredDict[sorted_row[0:5][2][0]] = 1
rowPredDict[sorted_row[0:5][3][0]] = 1
rowPredDict[sorted_row[0:5][4][0]] = 1
#print(count,sorted_row[0:2][0][0],",",sorted_row[0:2][1][0])
rowPredList.append(rowPredDict)
#count=count+1