选择每个 class 的 n 个元素

Selecting n-elements of each class

我正在使用 pandas,我有一组包含大约 400 万个观察值的数据。 我想知道 select 50 个随机元素或每个 class 的前 50 个元素的最佳/最快/最有效的方法是什么(class 只是一列)。

我的专栏中 class 的唯一数量约为 ~2k,我想要 select 100,000 个元素的子集,每个 class 50 个元素。

我正在考虑将它们分组到 class,然后遍历每个组并 select 前 50 个元素,然后进入下一组。

我想知道有没有更好的方法来做到这一点?

您需要使用 IIUC numpy.random.choice

import pandas as pd
import numpy as np 

df = pd.DataFrame({'class': [0,1,2,3,0,1,2,3,0,1,2,3],
               'value': [1,2,3,4,5,6,7,8,9,10,1,12]})


Samplesize = 2  #number of samples that you want       
print df.groupby('class', as_index=False).apply(lambda array: array.loc[np.random.choice(array.index, Samplesize, False),:])

输入

    class  value
0       0      1
1       1      2
2       2      3
3       3      4
4       0      5
5       1      6
6       2      7
7       3      8
8       0      9
9       1     10
10      2      1
11      3     12

输出

      class  value
0 8       0      9
  0       0      1
1 1       1      2
  5       1      6
2 6       2      7
  10      2      1
3 11      3     12
  3       3      4

给定以下数据框

df = pd.DataFrame(np.random.rand(100, 2), columns=list('ab'))
df['group'] = np.remainder(np.random.permutation(len(df)), 3)

df.head()

    a           b           group
0   0.069140    0.553955    1
1   0.564991    0.699645    2
2   0.251304    0.516667    2
3   0.962819    0.314219    2
4   0.353382    0.500961    0

您可以通过

获得随机版本
df_randomized = df.ix[np.random.permutation(len(df))]

df_randomized.head()

    a           b           group
90  0.734971    0.895469    0
35  0.195013    0.566211    0
27  0.370124    0.870052    2
21  0.297194    0.500713    1
66  0.319668    0.347365    2

到selectN个随机元素,先生成排列,缩小大小。之后将其应用于数据框:

N = 10
indexes = np.random.permutation(len(df))[:N]
df_randomized = df.ix[indexes]

要获取每个组的前 N ​​个元素,您可以对数据框进行分组,并对 select 前 N 个元素应用一种方法。这里不需要任何循环,因为 pandas 可以为您处理:

N = 10
df.groupby('group')\
    .apply(lambda x: x[:N][['a', 'b']])

所有这些方法都应该很快,因为它们使用 numpy 或 pandas 的内部优化方法。