2016-07-27 9 views
0

Gibt es eine idiomatische Art, dies in Pandas zu tun?Pandas wiederholt Werte

Ich möchte eine Spalte Set-up, das die ganzen Zahlen 1 bis 48, für einen Index der Länge wiederholt 2000:

df = pd.DataFrame(np.zeros((2000, 1)), columns=['HH']) 
h = 1 

for i in range(0,2000) : 
    df.loc[i,'HH'] = h 
    if h >=48 : h =1 
    else : h += 1 

Antwort

3

Hier ist direkter und schneller Weg:

pd.DataFrame(np.tile(np.arange(1, 49), 2000 // 48 + 1)[:2000], columns=['HH']) 

Der detaillierte Schritt:

  1. np.arange(1, 49) eine Reihe von 1 zu 48 schafft (im Lieferumfang enthalten)
>>> l = np.arange(1, 49) 
>>> l 
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
     35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48]) 
  1. np.tile(A, N) wiederholt die Array AN mal, so dass in diesem Fall, dass Sie [1 2 3 ... 48 1 2 3 ... 48 ... 1 2 3 ... 48] bekommen. Sie sollten das Array 2000 // 48 + 1 mal wiederholen, um mindestens 2000 Werte zu erhalten.
>>> r = np.tile(l, 2000 // 48 + 1) 
>>> r 
array([ 1, 2, 3, ..., 46, 47, 48]) 
>>> r.shape # The array is slightly larger than 2000 
(2016,) 
  1. [:2000] ruft die 2000 ersten Werte aus dem erzeugten Array Ihre DataFrame zu erstellen.
>>> d = pd.DataFrame(r[:2000], columns=['HH']) 
+0

nette Erklärung. Vielen Dank –

0
df = pd.DataFrame({'HH':np.append(np.tile(range(1,49),int(2000/48)), range(1,np.mod(2000,48)+1))}) 

Das heißt, Anfügen 2 Arrays:

(1) np.tile(range(1,49),int(2000/48))

len(np.tile(range(1,49),int(2000/48))) 
1968 

(2) range(1,np.mod(2000,48)+1)

len(range(1,np.mod(2000,48)+1)) 
32 

Und die DataFrame aus einem entsprechenden Wörterbuch erstellen.

Verwandte Themen