选择每个 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 的内部优化方法。
我正在使用 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 的内部优化方法。