2017-11-27 1 views
1

A Datenrahmen (DF) enthalten zwei Spalten wie folgt:Grouping gleitendes Fenster verwendet und Transponieren

A B 
46 0 
45 1 
46 1 
51 1 
47 1 
46 1 
45 0 
48 0 
47 0 
45 1 
49 1 

I ein gleitendes Fenster Art der Gruppierung für jede drei Zeilen entwerfen müssen, so dass:

1 Nehmen) erste drei Reihen, transponieren Spalt (A) und fügen dritten Eintrag der Kolonne (B), so erhalten wir eine Reihe von vier Spalten wie folgt:

46 45 46 1 

2) Dann um eine Zeile nach unten zu verschieben (dh Start aus Reihe 2 in Origina l df), wiederhole Schritt-1, so erhalten wir die zweite Ausgabe wie folgt.

45 46 51 1 

3) Bei jeder Iteration erhalten wir die aufeinanderfolgende Ausgabe wie folgt:

46 51 47 1 
51 47 46 1 
47 46 45 0 
... 

Zusammenfassend ist die gewünschte Ausgabe ist -

46 45 46 1 
45 46 51 1 
46 51 47 1 
51 47 46 1 
47 46 45 0 
... 
+0

nahm ich mir die Freiheit der Bearbeitung Ihrer Post verlangen mit der gewünschten Ausgabe für Klarheit ... Rollback, wenn falsch. –

Antwort

2

Hier ist eine Lösung mit numpy ‚s stride_tricks -

as_strided = np.lib.stride_tricks.as_strided 

w = 3 # window size 

i = as_strided(df.A.values, (len(df) - (w - 1), w), df.A.strides * 2) 
j = df[['B']].values[(w - 1):] 

np.hstack((i, j)) 

array([[46, 45, 46, 1], 
     [45, 46, 51, 1], 
     [46, 51, 47, 1], 
     [51, 47, 46, 1], 
     [47, 46, 45, 0], 
     [46, 45, 48, 0], 
     [45, 48, 47, 0], 
     [48, 47, 45, 1], 
     [47, 45, 49, 1]]) 
+0

@jezrael Sie haben die Frage missverstanden ... OP möchte eine rollende Transponierung –

+0

@jezrael Also, was ich denke OP versuchte zu tun war eine schrittweise iterative Erklärung, wie die Ausgabe gebildet wird. Ich denke, das hat dich verwirrt. Nachdem die Ausgabe der einzelnen Iterationen zusammengefügt wurde, wird das Problem ein wenig klarer. –

+0

Danke euch beiden. Tatsächlich wollte ich die Antwort von @ cᴏʟᴅsᴘᴇᴇᴅ, mit einem gleitenden Fenster. –

2

Hier ist ein numpy und Python-Ansatz

def get_list(x,m) : return list(zip(*(x[i:] for i in range(m)))) 

A = np.array(get_list(df['A'],3)) 
B = np.array(get_list(df['B'],3))[:,-1] 
new = np.append(A,B[:,None],1) 

array([[46, 45, 46, 1], 
     [45, 46, 51, 1], 
     [46, 51, 47, 1], 
     [51, 47, 46, 1], 
     [47, 46, 45, 0], 
     [46, 45, 48, 0], 
     [45, 48, 47, 0], 
     [48, 47, 45, 1], 
     [47, 45, 49, 1]]) 

Wie @coldspeed die Conversions Zeit und sind wenig computaionally teuer, so können wir eine einfache Liste Verständnis verwenden dh

A = get_list(df['A'],3) 
B = get_list(df['B'],3) 
new = [(*i,j[-1]) for i,j in zip(A,B)] 

[(46, 45, 46, 1), 
(45, 46, 51, 1), 
(46, 51, 47, 1), 
(51, 47, 46, 1), 
(47, 46, 45, 0), 
(46, 45, 48, 0), 
(45, 48, 47, 0), 
(48, 47, 45, 1), 
(47, 45, 49, 1)] 
+1

Denken Sie daran ... wenn Sie einen Ansatz mit 'np.append' verwenden, ist es _always_ schneller an einen Python anzuhängen Liste und konvertieren Sie es später, Konvertierung ist teuer, Sie müssen Speicher reservieren –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ aktualisiert :) – Dark