我有一個包含〜200,000行的熊貓數據框,我想創建5行隨機樣本1000行,但我不希望這些樣本中的任何一個包含相同的行兩次。熊貓創建沒有重複的隨機樣本
要創建一個隨機抽樣我一直在使用:
import numpy as np
rows = np.random.choice(df.index.values, 1000)
sampled_df = df.ix[rows]
不過只是做了幾次會冒重複的危險。處理此問題的最佳方法是跟蹤每次採樣哪些行?
我有一個包含〜200,000行的熊貓數據框,我想創建5行隨機樣本1000行,但我不希望這些樣本中的任何一個包含相同的行兩次。熊貓創建沒有重複的隨機樣本
要創建一個隨機抽樣我一直在使用:
import numpy as np
rows = np.random.choice(df.index.values, 1000)
sampled_df = df.ix[rows]
不過只是做了幾次會冒重複的危險。處理此問題的最佳方法是跟蹤每次採樣哪些行?
您可以使用df.sample
設置replace
到False
。
與100行和5列甲數據幀:
df = pd.DataFrame(np.random.randn(100, 5), columns = list("abcde"))
樣品5行:
df.sample(5)
Out[8]:
a b c d e
84 0.012201 -0.053014 -0.952495 0.680935 0.006724
45 -1.347292 1.358781 -0.838931 -0.280550 -0.037584
10 -0.487169 0.999899 0.524546 -1.289632 -0.370625
64 1.542704 -0.971672 -1.150900 0.554445 -1.328722
99 0.012143 -2.450915 -0.718519 -1.192069 -1.268863
這確保那些5行是不同的。如果你想重複這個過程,我建議抽樣number_of_rows * number_of_samples行。例如,如果每個樣本將包含5行,並且您需要10個樣本,則需要抽樣50行。第5將是第一個樣品,十二五將是第二...
all_samples = df.sample(50)
samples = [all_samples.iloc[5*i:5*i+5] for i in range(10)]
可以在np.random.choice
rows = np.random.choice(df.index.values, 1000, replace=False)
看看上numpy.random文檔
您的解決方案:
import numpy as np
rows = np.random.choice(df.index.values, 1000, replace=False)
sampled_df = df.ix[rows]
這將使隨機選擇無需替換。
如果您想要生成多個沒有任何共同元素的樣本,您需要在每次迭代後從每個選項中刪除元素。你可以使用numpy.setdiff1d。
import numpy as np
allRows = df.index.values
numOfSamples = 5
samples = list()
for i in xrange(numOfSamples):
choices = np.random.choice(allRows, 1000, replace=False)
samples.append(choices)
allRows = np.setdiff1d(allRows, choices)
這裏是0和100之間的範圍內的數字的一個工作示例:
In [58]: import numpy as np
In [59]: allRows = np.arange(100)
In [60]: numOfSamples = 5
In [61]: samples = list()
In [62]: for i in xrange(numOfSamples):
....: choices = np.random.choice(allRows, 5, replace=False)
....: samples.append(choices)
....: allRows = np.setdiff1d(allRows, choices)
....:
In [63]: samples
Out[63]:
[array([66, 24, 47, 31, 22]),
array([ 8, 28, 15, 62, 52]),
array([18, 65, 71, 54, 48]),
array([59, 88, 43, 7, 85]),
array([97, 36, 55, 56, 14])]
In [64]: allRows
Out[64]:
array([ 0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 16, 17, 19, 20, 21,
23, 25, 26, 27, 29, 30, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 44,
45, 46, 49, 50, 51, 53, 57, 58, 60, 61, 63, 64, 67, 68, 69, 70, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 89, 90, 91,
92, 93, 94, 95, 96, 98, 99])