2016-08-19 2 views
3

einen Datenrahmen von nur eine Spalte gegeben, wie kann ich es in einen anderen Datenrahmen "Puffer" (die Größe 2), konvertiere unten beschrieben:Erstellen Sie "Puffer" -Matrix aus Datenrahmen mit Rolling Window?

df =

0 
0 1 
1 2 
2 3 
3 4 
4 4 
5 5 
6 5 

expected_buffer =

0 1 
0 1 2 
1 2 3 
2 3 4 
3 4 5 

Dies ist mein Versuch:

def buff(df,past): 
    arr1=df.values 
    arr=arr1[0:past] 
    for i in xrange(past,df.shape[0]-past+2): 
     arr=np.append(arr,arr1[i:past+i],axis=0) 
    return pd.DataFrame(arr) 

Welche th zurück Folgendes:

0 
0 1 
1 2 
2 3 
3 4 
4 4 
5 5 
6 5 

Wie erhalten Sie die erwartete Buff-Ausgabe?

EDIT: Von past Ich meine die Puffergröße. Mit MATLAB Notationen: I 5 Element Spaltenvektor haben

df = [1;2;3;4;5] 

Wenn past 2 ist, sollte ich die folgende Ausgabe am Ende immer:

buff = [1 2; 2 3; 3 4; 4 5] 

Wenn past 3 ist, dann sollte erwartet ausgegeben werden

buff = [1 2 3; 2 3 4; 3 4 5] 

Wenn past 4 ist, dann ist zu erwarten Ausgang

buff = [1 2 3 4; 2 3 4 5] 

Also für n -elementigen df und past=m, würde ich eine Matrix der Größe (n-past+1) x past bekommen.

+1

Ich habe Probleme zu verstehen, was Sie wollen. Können Sie in Worten beschreiben, was Ihr "Puffer" sein soll? –

+0

'rr = pd.Serie ([0,1,2,3,4,4,5,5]); pd.DataFrame (Daten = {'A': rr, 'B': rr.shift (-1) .dropna()}) '? – Abdou

+0

Woher wissen Sie, wo der Puffer startet? – Merlin

Antwort

3
def buff(df, past): 
    a = np.concatenate([df.values[i:i-past] for i in range(past)], axis=1) 
    return pd.DataFrame(a, columns=list(range(past))) 

buff(df, 2) 

enter image description here

buff(df, 3) 

enter image description here

buff(df, 4) 

enter image description here

enter image description here

3
import pandas as pd 

def buff(s, n): 
    return (pd.concat([s.shift(-i) for i in range(n)], axis=1) 
       .dropna().astype(int)) 

s = pd.Series([1,2,3,4,5]) 
print(buff(s, 2)) 

# 0 0 
# 0 1 2 
# 1 2 3 
# 2 3 4 
# 3 4 5 

print(buff(s, 3)) 

# 0 0 0 
# 0 1 2 3 
# 1 2 3 4 
# 2 3 4 5 

print(buff(s, 4)) 

# 0 0 0 0 
# 0 1 2 3 4 
# 1 2 3 4 5 
Verwandte Themen