2017-01-10 17 views
0

に基づいてパンダのデータフレームからランダムに行を選択:は、私は以下のようなパンダのデータフレームを持ってカウント

col1, col2, label 
a, b , cat 
b, b1, , mouse 
. 
. 
.........., elephant 
.........., mouse 

とラベル列のvalue_counts:私は、少なくともN行を選択したい

df.dataframe.value_counts: 

cat: 7599 
mouse: 6458 
dog: 5100 
elephant: 5000 

各ラベルカテゴリから無作為にvalue_countsが得られます。

cat: N 
mouse: N 
dog: N 
elephant: N 

これを行う "パンデミック"の方法?

答えて

4

最初sample(frac=1)の方法を使用してDFをシャッフルしてから(labelでgroupped)各グループから最初のN行を選ぶことができます。

df.sample(frac=1).groupby('label', sort=False).head(N) 

デモ:

In [108]: df.sample(frac=1).groupby('label', sort=False).head(3) 
Out[108]: 
    col1 label 
11  9  a 
28  4  a 
58  0  a 
96  5  c 
99  3  b 
35  6  c 
88  8  c 
97  9  b 
83  7  b 

セットアップ:

In [106]: df = pd.DataFrame({'label':np.random.choice(list('abc'), 100), 'col1':np.random.randint(0, 10, 100)}) 

In [107]: df 
Out[107]: 
    col1 label 
0  4  c 
1  6  b 
2  9  c 
3  0  b 
4  5  a 
5  3  a 
6  3  b 
7  6  c 
8  7  b 
9  6  a 
.. ... ... 
90  4  b 
91  5  b 
92  8  c 
93  2  c 
94  9  a 
95  2  a 
96  5  c 
97  9  b 
98  8  b 
99  3  b 

[100 rows x 2 columns] 

ヒント:可能な限り最大限のNを見つけたい場合は、電子例えば必要な場合は、groupbysampleを使用することができ、次のコード(@NickilMaveli for the ideaに感謝)

N = df.label.value_counts(sort=False).min() # (or) df.label.value_counts().iloc[-1] 
+1

、 'N = df.label.value_counts(正規化= TRUE).iloc [-1] * df.shape [ 0] 'から' .head'を呼び出すことができます。 –

+1

@NickilMaveli、ありがとうございます!私は答えにそれを加えました – MaxU

0

60%グループ当たりのサンプル:あなたが追加することができ、最適な 'N'値は、この場合を一般化する

print (df.groupby('label').apply(lambda x: x.sample(frac=0.6))) 
関連する問題