我使用的是熊貓,我有一組數據和大約4千萬觀察值。 我想知道什麼是爲每個類選擇50個隨機元素或前50個元素的最佳/最快/最有效的方式(類只是一列)。選擇每個類的n元素
我列中的唯一類數約爲2k,我想選擇100,000個元素的子集,每個類有50個元素。
我在考慮將它們分組到課堂,然後遍歷每個組並選擇前50個元素,然後繼續到下一個組。
我想知道有沒有更好的方法來做到這一點?
我使用的是熊貓,我有一組數據和大約4千萬觀察值。 我想知道什麼是爲每個類選擇50個隨機元素或前50個元素的最佳/最快/最有效的方式(類只是一列)。選擇每個類的n元素
我列中的唯一類數約爲2k,我想選擇100,000個元素的子集,每個類有50個元素。
我在考慮將它們分組到課堂,然後遍歷每個組並選擇前50個元素,然後繼續到下一個組。
我想知道有沒有更好的方法來做到這一點?
考慮下面的數據幀
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的或熊貓的內部優化的方法。
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
感謝您的回答,但是當我有一個觀察次數小於指定Samplesize的類時,我無法使用該解決方案。我發現ValueError:'replace = False'時不能取大於樣本的樣本 – sebb
print df.groupby('class',as_index = False).apply(lambda array:array.loc [np.random.choice(array.index ,Samplesize,True),]]]) 使用這個,只記得當它是True時樣本可能有重複 – Shijo
@sebb你說你想要每個類有50個元素。如果一個類的元素少於50個,那麼你不能這樣做,因此引發異常看起來是正確的。 – Goyo