Python中的多个索引随机抽样

时间:2016-09-29 07:32:30

标签: python sampling

我有一个数据框如下:

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 

我想根据 id_1 从此表中取出一个大小为n的随机样本,无需替换。对于 id_1 列,此行必须是唯一的,并且只能出现一次。

最终结果如下:

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

我尝试过一个分组,并使用索引通过 random.sample 取出一行,但它一直都是这样。

有人可以给我一个关于如何使这项工作的指针吗?下面的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]})

2 个答案:

答案 0 :(得分:1)

每个id随机抽样一次:

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

PS:

使用pythons list comprehension在上面的解决方案中翻译,返回一个索引列表:

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

答案 1 :(得分: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由随机shuffle + id_1选择的唯一元素创建。然后,在其上生成随机样本(无替换)。