Python 选择每个类的n个元素

Python 选择每个类的n个元素,python,pandas,sklearn-pandas,Python,Pandas,Sklearn Pandas,我用的是熊猫,我有一组数据,大约有400万次观测。 我想知道选择50个随机元素或每个类的前50个元素(类只是一列)的最佳/最快/最有效的方法是什么 在我的专栏中,类的唯一数量大约是~2k,我想选择100000个元素的子集,每个类50个元素 我在考虑将它们分组到类中,然后遍历每个组并选择前50个元素,然后继续下一个组 我想知道有没有更好的方法可以做到这一点?您需要使用IIUC 输入 class value 0 0 1 1 1 2 2

我用的是熊猫,我有一组数据,大约有400万次观测。 我想知道选择50个随机元素或每个类的前50个元素(类只是一列)的最佳/最快/最有效的方法是什么

在我的专栏中,类的唯一数量大约是~2k,我想选择100000个元素的子集,每个类50个元素

我在考虑将它们分组到类中,然后遍历每个组并选择前50个元素,然后继续下一个组

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

您需要使用IIUC

输入

    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
你需要使用的IIUC

输入

    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
要选择N个随机元素,首先生成置换并减小其大小。然后将其应用于数据帧:

N = 10
indexes = np.random.permutation(len(df))[:N]
df_randomized = df.ix[indexes]
要获得每个组的前N个元素,可以对数据帧进行分组,并应用方法选择前N个元素。这里不需要任何循环,因为熊猫可以为您处理:

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

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

给定以下数据帧

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
要选择N个随机元素,首先生成置换并减小其大小。然后将其应用于数据帧:

N = 10
indexes = np.random.permutation(len(df))[:N]
df_randomized = df.ix[indexes]
要获得每个组的前N个元素,可以对数据帧进行分组,并应用方法选择前N个元素。这里不需要任何循环,因为熊猫可以为您处理:

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

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

谢谢你的回答,但是当我有一个观察数量小于我指定样本大小的类时,我不能使用该解决方案。Im发生值错误:当“replace=False”打印df.groupby('class',as_index=False)时,无法获取比总体更大的样本。应用(lambda数组:array.loc[np.random.choice(array.index,Samplesize,True),:])使用这个,只需记住,样本在使用时可能有重复项True@sebb你说过每个类需要50个元素。如果一个类的元素少于50个,你就不能这样做,因此引发一个异常看起来是正确的做法。谢谢你的回答,但是当我有一个类的观察数量小于我指定的样本大小时,我不能使用该解决方案。Im发生值错误:当“replace=False”打印df.groupby('class',as_index=False)时,无法获取比总体更大的样本。应用(lambda数组:array.loc[np.random.choice(array.index,Samplesize,True),:])使用这个,只需记住,样本在使用时可能有重复项True@sebb你说过每个类需要50个元素。如果一个类包含的元素少于50个,则不能包含这些元素,因此引发异常看起来是正确的做法。