Python Pandas从Groupby中选择随机样本

17

如何从groupby中获取随机抽样?据我了解,groupby只是对分组进行迭代的方式。

如果我想从一个可迭代对象中选择N=200个元素,我通常会使用以下标准方法:

rand = random.sample(data, N)  
如果您尝试上述操作,其中数据是“分组”的,那么结果列表的元素因某种原因是元组。我找到了下面的示例,用于随机选择单个键groupby的元素,但这在多键groupby中不起作用。来自如何按键访问pandas groupby dataframe

创建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')

对我来说,在第二步之前必须添加 import random,并在第三步中使用 list(df_list) 将其放置为 pd.concat(list(df_list)) - MItrajyoti
3个回答

16
你可以随机抽取 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

但是,如果你只是想获取每个组的值,甚至不需要使用groupbyMultiIndex就可以胜任:

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

非常详细,感谢您包含了多索引示例。 - sfortney
如何从每个组合中获取一定比例的行 - Salih

4

我觉得低级别的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

我很喜欢这个,因为它实际上很容易理解。 - Maxim Moloshenko

-1

虽然这个问题早已被提出并回答,但我认为以下方法更加简洁:

import pandas as pd


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

# Set the number of samples by group
n_samples_by_group = 1
samples_by_group = df \
    .groupby(by=["some_key1", "some_key2"]) \
    .sample(n_samples_by_group)

3
这会从每个组中随机选择X个项目,而不是从X个随机的组中选择。 - Tom
你是正确的!我的错... - Esteban Jiménez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接