0

データフレームがあり、各行で最大 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
4

2 に答える 2