25

I want to know if Python has an equivalent to the sample() function in R.

The sample() function takes a sample of the specified size from the elements of x using either with or without replacement.

The syntax is:

sample(x, size, replace = FALSE, prob = NULL)

(More information here)

Alex Riley
  • 169,130
  • 45
  • 262
  • 238
Bilal
  • 2,883
  • 5
  • 37
  • 60

4 Answers4

41

I think numpy.random.choice(a, size=None, replace=True, p=None) may well be what you are looking for.

The p argument corresponds to the prob argument in the sample()function.

Julian Wittische
  • 1,219
  • 14
  • 22
10

In pandas (Python's closest analogue to R) there are the DataFrame.sample and Series.sample methods, which were both introduced in version 0.16.1.

For example:

>>> df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, 7, 8, 9, 0]})
>>> df
   a  b
0  1  6
1  2  7
2  3  8
3  4  9
4  5  0

Sampling 3 rows without replacement:

>>> df.sample(3)
   a  b
4  5  0
1  2  7
3  4  9

Sample 4 rows from column 'a' with replacement, using column 'b' as the corresponding weights for the choices:

>>> df['a'].sample(4, replace=True, weights=df['b'])
3    4
0    1
0    1
2    3

These methods are almost identical to the R function, allowing you to sample a particular number of values - or fraction of values - from your DataFrame/Series, with or without replacement. Note that the prob argument in R's sample() corresponds to weights in the pandas methods.

Alex Riley
  • 169,130
  • 45
  • 262
  • 238
0

I believe that the random package works. Specifically random.sample().

here

polka
  • 1,383
  • 2
  • 25
  • 40
  • Unfortunately, the function you propose does not offer the possibility of random sampling with replacement. The functions @ajcr and I propose can do it. – Julian Wittische Dec 03 '15 at 22:21
0

Other answers here are great, but I'd like to mention an alternative from Scikit-Learn that we can also use for this, see this link.

Something like this:

resample(np.arange(1,100), n_samples=100, replace=True,random_state=2)

Gives you this:

[41 16 73 23 44 83 76  8 35 50 96 76 86 48 64 32 91 21 38 40 68  5 43 52
 39 34 59 68 70 89 69 47 71 96 84 32 67 81 53 77 51  5 91 64 80 50 40 47
  9 51 16  9 18 23 74 58 91 63 84 97 44 33 27  9 77 11 41 35 61 10 71 87
 71 20 57 83  2 69 41 82 62 71 98 19 85 91 88 23 44 53 75 73 91 92 97 17
 56 22 44 94]
Aquiles Páez
  • 503
  • 6
  • 18