我有一个数据框如下:
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]})
答案 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
选择的唯一元素创建。然后,在其上生成随机样本(无替换)。