2016-11-06 10 views
0

正確な個のランダムな行をDataFrameから効率的に選択するにはどうすればよいですか? データには、使用できるインデックス列が含まれています。 最大サイズを使用する必要がある場合は、インデックスの列でcount()またはmax()の方が効率的です。DataFrameからランダムな行の正確な数を選択する方法

+0

は、あなただけの 'df.sample()'を使用することはできませんか? – mtoto

+0

@mtoto sample()はおおよその数値を返しますが、アルゴリズムによっては特定のシナリオで正確な数値が要求されます。 – Boris

答えて

2

可能なアプローチは、この範囲から任意の長さのランダム系列を生成するpythonrandom libraryからsample()を使用し、その後、.count()を使用して行数を計算することです。最後に、得意先番号valsのリストを使用して、インデックス列をサブセット化します。

import random 
def sampler(df, col, records): 

    # Calculate number of rows 
    colmax = df.count() 

    # Create random sample from range 
    vals = random.sample(range(1, colmax), records) 

    # Use 'vals' to filter DataFrame using 'isin' 
    return df.filter(df[col].isin(vals)) 

例:

df = sc.parallelize([(1,1),(2,1), 
        (3,1),(4,0), 
        (5,0),(6,1), 
        (7,1),(8,0), 
        (9,0),(10,1)]).toDF(["a","b"]) 

sampler(df,"a",3).show() 
+---+---+ 
| a| b| 
+---+---+ 
| 3| 1| 
| 4| 0| 
| 6| 1| 
+---+---+ 
+0

ご意見ありがとうございます。これも私がやったことです。このソリューションを使用したくない理由は、** count()**メソッドの使用です。これは非常に高価です。 – Boris

+0

'df'をキャッシュし、' count() 'を関数の外側で計算するか、' agg(max) 'を使うこともできます。 – mtoto

+1

ありがとう、あなたのソリューションをJavaで使いました。 – Boris

関連する問題