Python 选择每个类的n个元素
我用的是熊猫,我有一组数据,大约有400万次观测。 我想知道选择50个随机元素或每个类的前50个元素(类只是一列)的最佳/最快/最有效的方法是什么 在我的专栏中,类的唯一数量大约是~2k,我想选择100000个元素的子集,每个类50个元素 我在考虑将它们分组到类中,然后遍历每个组并选择前50个元素,然后继续下一个组 我想知道有没有更好的方法可以做到这一点?您需要使用IIUC 输入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
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个,则不能包含这些元素,因此引发异常看起来是正确的做法。