2016-11-15 10 views
2

以下のデータフレームでは、「Subject」、「Rep」および「yval」の3つのフィールドでgroupbyを実行しています。パンダの各グループのn行のサンプル

import pandas as pd 
yval = [[1]*30 + [2]*20 + [1]*20 + [2]*30 ] 
yval = reduce(lambda x,y: x+y, yval) 
df = pd.DataFrame({'yval': yval , 'xval':np.random.randn(100)}) 
df['Subject'] = ['S01'] * 50 + ['S02'] * 50 
l = [[x] * 10 for x in range(3)] + [[x] * 10 for x in range(2)] + [[x] * 10 for x in range(2)] + [[x] * 10 for x in range(3)] 
l = reduce(lambda x,y: x+y,l) 
df['Rep'] = l 
df 


for k, t in df.groupby(['Subject', 'yval', 'Rep']): 
    print k 


('S01', 1, 0) 
('S01', 1, 1) 
('S01', 1, 2) 
('S01', 2, 0) 
('S01', 2, 1) 
('S02', 1, 0) 
('S02', 1, 1) 
('S02', 2, 0) 
('S02', 2, 1) 
('S02', 2, 2) 

私はグループからそれぞれn行を選択する方法を見つけようとしています。この例では、n = 2と仮定すると、次の結果が得られる可能性があります。 n=4の場合は、すべて(全データフレーム)が必要です。

('S01', 1, 0) 
('S01', 1, 2) 
('S01', 2, 0) 
('S01', 2, 1) 
('S02', 1, 0) 
('S02', 1, 1) 
('S02', 2, 1) 
('S02', 2, 2) 

enter image description here

+0

私は質問を正しく理解していません。 「2つのランダムに選択されたグループに関連するすべてのデータを選択する」とはどういう意味ですか?下の出力から推測できないようですが、2つのグループを削除するという意味ですか? –

+0

上記の図では、各グループから異なる色で色付けされた「n」行を選ぶことに興味があります。 「すべてのデータを選ぶ」とは、実際のデータフレームから対応するデータを抽出することを意味します。 – learner

答えて

1

私が正しく理解していれば、ここにあなたがそれを行うことができ方法です:

import random 

# Do the groupby 
gps = df.groupby(['Subject', 'yval', 'Rep']) 

つのオプション、1の方が高速ですが、より多くの行が必要です。

# Option 1: sample (20.6 µs per loop) 
group_list = random.sample(gps.groups.keys(), len(gps.groups)-2) 

# Option 2: shuffle (15.1 µs per loop) 
# Store the dict keys into a list 
group_list = list(gps.groups.keys()) 
random.shuffle(group_list) 
# Get all but the last two 
group_list = group_list[:-2] 
+0

thaks。私は私のOPを編集しました。 – learner

関連する問題