【问题标题】:Python Pandas Choosing Random Sample of Groups from GroupbyPython Pandas 从 Groupby 中选择随机组样本
【发布时间】:2015-11-27 05:18:08
【问题描述】:

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

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

rand = random.sample(data, N)  

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

我发现以下示例用于随机选择单个键 groupby 的元素,但这不适用于多键 groupby。来自How to access pandas groupby dataframe by key

创建分组对象

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

【问题讨论】:

    标签: python pandas random group-by


    【解决方案1】:

    您可以对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
    

    【讨论】:

    • 非常彻底。感谢您提供多索引示例。
    • 如何从每个组合中获取行的百分比
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2018-09-12
      • 2018-09-17
      • 2021-11-17
      • 2020-05-25
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多