繁体   English   中英

Python Pandas 从 Groupby 中选择组的随机样本

[英]Python Pandas Choosing Random Sample of Groups from Groupby

获取groupby元素的随机样本的最佳方法是什么? 据我了解,一个groupby只是一个可迭代的组。

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

rand = random.sample(data, N)  

如果您尝试上述数据是“分组”的,则结果列表的元素出于某种原因是元组。

我发现下面的示例用于随机选择单个键groupby的元素,但是这不适用于多键groupby 来自, 如何通过键访问pandas 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)

可选 - 将其全部转回单个数据帧对象

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

你可以采取的唯一值的随机量样品df.some_key.unique()用它来切片df最后groupby对所得:

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

但是如果你只是想获得每个组的值,你甚至不需要groubpyMultiIndex会做:

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

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

import pandas as pd
import numpy as np

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],
    }
)

ids = df["some_key"].unique()
ids = np.random.choice(ids, size=2, replace=False)
ids

# > array([3, 2])

df.loc[df["some_key"].isin(ids)]

# >     some_key  val
# 2          2    3
# 3          3    4
# 6          2    1
# 7          3    5
# 10         2    7
# 11         3    8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM