2016-09-29 46 views
1

我具有根據以下的數據幀:在多個索引的Python隨機抽樣

 
id_1 id_2 value 
1  0  1 
1  1  2 
1  2  3 
2  0  4 
2  1  1 
3  0  5 
3  1  1 
4  0  5 
4  1  1 
4  2  6 
4  3  7 
11 0  8 
11 1  14 
13 0  10 
13 1  9 

我想取出大小爲n的隨機樣本,無需更換,從基於ID_1此表。此行必須與id_1列唯一,並且只能出現一次。

最終結果是這樣的:

 
id_1 id_2 value 
1  1  2 
2  0  4 
4  3  7 
13 0  10 

我曾嘗試做一組,並使用該指數通過random.sample採取了行,但它dosent一路走下去。

有人可以給我一個關於如何使這項工作的指針嗎?代碼爲DF下面!

一如既往,感謝您的時間和輸入!

/swepab

df = pd.DataFrame({'id_1' : [1,1,1,2,2,3,3,4,4,4,4,11,11,13,13], 
       'id_2' : [0,1,2,0,1,0,1,0,1,2,3,0,1,0,1], 
       'value_col' : [1,2,3,4,1,5,1,5,1,6,7,8,14,10,9]}) 

回答

1

可以使用

import numpy as np 

uniqued = df.id_1.reindex(np.random.permutation(df.index)).drop_duplicates() 

df.ix[np.random.choice(uniqued.index, 1, replace=False)] 

uniqued做到這一點使用矢量化功能(不循環)通過獨特的元素進行隨機洗牌+選擇通過id_1創建。然後,在其上生成一個隨機樣本(沒有替換)。

+0

好的,這看起來很整齊,而且速度很快,因爲它有很多數據。讓我測試它真的很快,並在一瞬間回來! – swepab

+0

@swepab回顧一下,可以通過僅在id_1列上執行第一部分來加快速度。查看更新。 –

+0

只是最後一個問題,如果你不介意 - 是否有辦法對樣本進行分層,所以它會考慮* id_2 *的大小,它可以有不同數量的行,或者這些都是一個新的問題? – swepab

1

這樣一個每ID隨機:

for id in sorted(set(df["id_1"])): 
    print(df[df["id_1"] == id].sample(1)) 

PS:

翻譯的使用溶液蟒列表理解,返回的指數列表以上

idx = [df[df["id_1"] == val].sample(1).index[0] for val in sorted(set(df["id_1"]))]