2016-11-15 42 views
2

在下面的數據框中,我在三個字段上進行groupby:'Subject','Rep'和'yval'。從熊貓的每個組中取樣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

我不確定我是否正確地理解了這個問題。你是什​​麼意思「挑選與兩個隨機選擇的組相關的所有數據」?從下面的輸出我似乎無法推斷,你的意思是刪除兩個組? –

+0

在上圖中,我感興趣的是從每組中挑選'n'行,並用不同的顏色着色。 「選取所有數據」意味着從實際數據框中提取相應的數據。 – learner

回答

1

如果我理解正確的話,這裏有一個方法,你可以這樣做:

import random 

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

兩個選擇,一個是快,但需要更多的線路。

# 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

泰克。我編輯了我的OP。 – learner