Mvvとcountの2つの列を持つデータフレームに取り組んでいます。
+---+-----+
|mvv|count|
+---+-----+
| 1 | 5 |
| 2 | 9 |
| 3 | 3 |
| 4 | 1 |
mVV値とカウント値を含む2つのリストを取得したいのですが。何かのようなもの
mvv = [1,2,3,4]
count = [5,9,3,1]
だから、私は次のコードを試してみました:最初の行はPythonの行リストを返すべきです。最初の値を見たかったのです。
mvv_list = mvv_count_df.select('mvv').collect()
firstvalue = mvv_list[0].getInt(0)
しかし、2行目にエラーメッセージが表示されます。
AttributeError:getInt
どうしてこのようなやり方がうまくいかないのでしょう。まず、 Row Typeから整数を取得しようとしています。コレクションの出力は次のようになります。
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
あなたがこのようなものを取るならば:
>>> firstvalue = mvv_list[0].mvv
Out: 1
mvv
という値が得られます。配列のすべての情報が必要な場合は、次のようにします。
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
しかし、他のコラムでも同じことを試すと、次のようになります。
>>> mvv_count = [int(row.count) for row in mvv_list.collect()]
Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'
これはcount
が組み込みメソッドであるために起こります。また、列はcount
と同じ名前です。これを回避するには、count
の列名を_count
に変更します。
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
辞書の構文を使用して列にアクセスできるので、この回避策は必要ありません。
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
そしてそれはついにうまくいくでしょう!
一つのライナーをたどるとあなたが望むリストが得られます。
mvv = mvv_count_df.select("mvv").rdd.flatMap(lambda x: x).collect()
これにより、すべての要素がリストとして表示されます。
mvv_list = list(
mvv_count_df.select('mvv').toPandas()['mvv']
)
次のコードはあなたを助けるでしょう
mvv_count_df.select('mvv').rdd.map(lambda row : row[0]).collect()
下記のエラーが発生した場合:
AttributeError: 'list'オブジェクトには属性 'collect'がありません
このコードはあなたの問題を解決します:
mvv_list = mvv_count_df.select('mvv').collect()
mvv_array = [int(i.mvv) for i in mvv_list]
私のデータで私はこれらのベンチマークを得ました:
>>> data.select(col).rdd.flatMap(lambda x: x).collect()
0.52秒
>>> [row[col] for row in data.collect()]
0.271秒
>>> list(data.select(col).toPandas()[col])
0.427秒
結果は同じです