【问题标题】:Randomly combine pandas group objects随机组合 pandas 组对象
【发布时间】:2016-03-28 14:53:33
【问题描述】:

问题:

如何使用 pandas df.groupby() 函数来创建随机选择的组?

示例:

我想将数据帧分组为大小为 n 的随机组,其中 n 对应于给定列中唯一值的数量。

我有一个包含各种列的数据框,包括“id”。有些行具有唯一的 ID,而其他行可能具有相同的 ID。例如:

   c1 id c2
0   a  1  4
1   b  2  6
2   c  2  2
3   d  5  7 
4   y  9  3

实际上,这个数据框最多可以有 1000 行左右。

我希望能够使用以下标准对该数据框进行分组:

  • 每个组最多应包含 n 个唯一 ID
  • id 不能出现在多个组中
  • 应随机选择给定组中的特定 ID
  • 每个 id 都应该出现在一个组中

例如,示例数据框(上图)可能变为:

组1:

   c1 id c2
0   a  1  4
4   y  9  3

组2:

   c1 id c2
1   b  2  6
2   c  2  2
3   d  5  7 

其中 n = 2

感谢您的建议。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    uniq groupby 声明似乎很难。一种方法:

    uniq=df['id'].unique()
    random.shuffle(uniq)
    groups=np.split(uniq,2)
    dfr=df.set_index(df['id'])
    
    for gp in groups : print (dfr.loc[gp])
    

    对于

       c1  id  c2
    id           
    9   y   9   3
    1   a   1   4
    
       c1  id  c2
    id           
    5   d   5   7
    2   b   2   6
    2   c   2   2
    

    如果组的大小(n) 不能分割len(uniq),您可以改用np.split(uniq,range(n,len(uniq),n))

    【讨论】:

      【解决方案2】:

      这是一种方法:

      import numpy as np
      
      df = pd.DataFrame({'c1':list('abcdy'), 'id':[1,2,2,5,9], 'c2':[4,6,2,7,3]})
      
      n = 2
      shuffled_ids = np.random.permutation(df['id'].unique())
      id_groups  = [shuffled_ids[i:i+n] for i in xrange(0, len(shuffled_ids), n)]
      groups = [df['id'].apply(lambda x: x in g) for g in id_groups]
      

      输出:

      In [1]: df[groups[0]]
      Out[1]:
        c1  c2  id
      1  b   6   2
      2  c   2   2
      3  d   7   5
      
      In [2]: df[groups[1]]
      Out[2]:
        c1  c2  id
      0  a   4   1
      4  y   3   9
      

      这种方法不涉及更改索引,以防您需要保留它。

      【讨论】:

      • 非常感谢您的回答。它很好地完成了这项工作。我最终选择了 B.M. 下面的答案作为接受的答案,只是因为它更快。如果我也能接受你的,我会的。
      • 那是因为另一个答案是修改数据框的索引。如果可以接受,您可以忽略groups 并在更改索引后直接按id_groups 索引(即df2 = df.set_index('id')df2.ix[id_groups[0]])。这可能会解决性能问题。
      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2015-07-04
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多