2015-05-19 18 views
21

Ho un frame dati panda con 50k righe. Sto cercando di aggiungere una nuova colonna che è un intero generato in modo casuale da 1 a 5.Panda: crea una nuova colonna in df con numeri interi casuali dal range

Se voglio 50k numeri casuali userei:

df1['randNumCol'] = random.sample(xrange(50000), len(df1)) 

ma per questo non sono sicuro come farlo.

Nota a margine in R, mi piacerebbe fare:

sample(1:5, 50000, replace = TRUE) 

Qualche suggerimento?

+0

In panda/numpy, esiste una funzione diretta 'np.random.randint (basso, alto, dimensione)'. Non c'è bisogno di generare effettivamente il range 'low: high' e campionarlo da esso, come facciamo in R. – smci

risposta

31

Una soluzione è quella di utilizzare np.random.randint:

import numpy as np 
df1['randNumCol'] = np.random.randint(1, 6, df1.shape[0]) 

# or if the numbers are non-consecutive (albeit slower) 
df1['randNumCol'] = np.random.choice([1, 9, 20], df1.shape[0]) 

Al fine di rendere i risultati riproducibili è possibile impostare il seme con np.random.seed(42).

+0

Grazie anche per la parte' random.seed'. – screechOwl

+0

Prego, sarei felice di poterti aiutare. – Matt

+0

@screechOwl: questa soluzione è inferiore all'utilizzo di 'np.random.randint()' per la mia soluzione. – smci

2

Per aggiungere una colonna di numeri interi casuali, utilizzare randint(low, high, size). Non è necessario sprecare memoria allocando range(low, high); potrebbe essere un sacco di memoria se high è grande.

df1['randNumCol'] = np.random.randint(0,5, size=len(df1)) 

(Si noti anche che, quando stiamo solo aggiunta di una colonna, la dimensione è solo un numero intero. In generale, se vogliamo generare una matrice/dataframe di randint()s, formato può essere una tupla, come in Pandas: How to create a data frame of random integers?)