Python从Groupby中随机选择组样本

Python从Groupby中随机选择组样本,python,pandas,random,group-by,Python,Pandas,Random,Group By,获取groupby元素的随机样本的最佳方法是什么?据我所知,groupby只是组上的一个可数 如果我想选择N=200个元素,我对iterable执行此操作的标准方法是: rand = random.sample(data, N) 如果在数据为“分组”的情况下尝试上述操作,则出于某种原因,结果列表的元素为元组 我发现下面的示例用于随机选择单个键groupby的元素,但是这不适用于多键groupby。从 创建groupby对象 grouped = df.groupby('some_key')

获取groupby元素的随机样本的最佳方法是什么?据我所知,groupby只是组上的一个可数

如果我想选择N=200个元素,我对iterable执行此操作的标准方法是:

rand = random.sample(data, N)  
如果在数据为“分组”的情况下尝试上述操作,则出于某种原因,结果列表的元素为元组

我发现下面的示例用于随机选择单个键groupby的元素,但是这不适用于多键groupby。从

创建groupby对象

grouped = df.groupby('some_key')
选取N个数据帧并获取它们的索引

sampled_df_i = random.sample(grouped.indices, N)
使用groupby对象“get_group”方法获取组

df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i)
可选-将其全部转换回单个dataframe对象

sampled_df = pd.concat(df_list, axis=0, join='outer')

您可以对df.some_key.unique的唯一值进行随机采样,使用该采样对df进行切片,最后对结果进行分组:

In [337]:

df = pd.DataFrame({'some_key': [0,1,2,3,0,1,2,3,0,1,2,3],
                   'val':      [1,2,3,4,1,5,1,5,1,6,7,8]})
In [338]:

print df[df.some_key.isin(random.sample(df.some_key.unique(),2))].groupby('some_key').mean()
               val
some_key          
0         1.000000
2         3.666667
如果存在多个groupby键:

In [358]:

df = pd.DataFrame({'some_key1':[0,1,2,3,0,1,2,3,0,1,2,3],
                   'some_key2':[0,0,0,0,1,1,1,1,2,2,2,2],
                   'val':      [1,2,3,4,1,5,1,5,1,6,7,8]})
In [359]:

gby = df.groupby(['some_key1', 'some_key2'])
In [360]:

print gby.mean().ix[random.sample(gby.indices.keys(),2)]
                     val
some_key1 some_key2     
1         1            5
3         2            8
但是,如果您只想获得每个组的值,您甚至不需要抱怨,MultiIndex可以做到:

我觉得低级numpy操作更干净:

作为pd进口熊猫 将numpy作为np导入 df=pd.DataFrame { some_键:[0,1,2,3,0,1,2,3,0,1,2,3], 瓦尔:[1,2,3,4,1,5,1,5,1,6,7,8], } ids=df[some_key]。唯一 ids=np.random.choiceids,大小=2,替换=False 身份证 >数组[3,2] df.loc[df[some_key].isinids] >一些钥匙 2 2 3 3 3 4 6 2 1 7 3 5 10 2 7 11 3 8
非常彻底。感谢您提供多索引示例。
In [372]:

idx = random.sample(set(pd.MultiIndex.from_product((df.some_key1, df.some_key2)).tolist()),
                    2)
print df.set_index(['some_key1', 'some_key2']).ix[idx]
                     val
some_key1 some_key2     
2         0            3
3         1            5