2017-11-04 7 views
2

Der folgende Code generiert die gewünschte Ausgabe in ONE Datenrahmen, jedoch möchte ich dynamisch Datenrahmen in einer FOR-Schleife erstellen und dann den verschobenen Wert diesem Datenrahmen zuweisen. Beispiel, Datenrahmen df_lag_12 würde nur column1_t12 und column2_12 enthalten. Irgendwelche Ideen würden sehr geschätzt werden. Ich habe versucht, dynamisch mit der EXEC-Anweisung 12 Datenrahmen zu erstellen, die Google-Suche scheint dies als schlechte Praxis zu bezeichnen.Python Pandas Dynamisch Erstellen eines Datenrahmens

import pandas as pd 
list1=list(range(0,20)) 
list2=list(range(19,-1,-1)) 
d={'column1':list(range(0,20)), 
    'column2':list(range(19,-1,-1))} 
df=pd.DataFrame(d) 
df_lags=pd.DataFrame() 
for col in df.columns: 
    for i in range(12,0,-1): 
     df_lags[col+'_t'+str(i)]=df[col].shift(i) 
    df_lags[col]=df[col].values 
print(df_lags) 
for df in (range(12,0,-1)): 
    exec('model_data_lag_'+str(df)+'=pd.DataFrame()') 

gewünschte Ausgabe für dymanically Datenrahmen DF_LAGS_12 erstellt:

var_list=['column1_t12','column2_t12'] 
df_lags_12=df_lags[var_list] 
print(df_lags_12) 

Antwort

2

Ich denke, das Beste ist dictionary of DataFrames erstellen:

d = {} 
for i in range(12,0,-1): 
    d['t' + str(i)] = df.shift(i).add_suffix('_t' + str(i)) 

Wenn Bedarf ersten Spalten angeben:

d = {} 
cols = ['column1','column2'] 
for i in range(12,0,-1): 
    d['t' + str(i)] = df[cols].shift(i).add_suffix('_t' + str(i)) 

dict comprehension Lösung:

d = {'t' + str(i): df.shift(i).add_suffix('_t' + str(i)) for i in range(12,0,-1)} 

print (d['t10']) 
    column1_t10 column2_t10 
0   NaN   NaN 
1   NaN   NaN 
2   NaN   NaN 
3   NaN   NaN 
4   NaN   NaN 
5   NaN   NaN 
6   NaN   NaN 
7   NaN   NaN 
8   NaN   NaN 
9   NaN   NaN 
10   0.0   19.0 
11   1.0   18.0 
12   2.0   17.0 
13   3.0   16.0 
14   4.0   15.0 
15   5.0   14.0 
16   6.0   13.0 
17   7.0   12.0 
18   8.0   11.0 
19   9.0   10.0 

EDIT: Ist es möglich, von Globals, aber viel besser ist dictionary:

d = {} 
cols = ['column1','column2'] 
for i in range(12,0,-1): 
    globals()['df' + str(i)] = df[cols].shift(i).add_suffix('_t' + str(i)) 

print (df10) 
    column1_t10 column2_t10 
0   NaN   NaN 
1   NaN   NaN 
2   NaN   NaN 
3   NaN   NaN 
4   NaN   NaN 
5   NaN   NaN 
6   NaN   NaN 
7   NaN   NaN 
8   NaN   NaN 
9   NaN   NaN 
10   0.0   19.0 
11   1.0   18.0 
12   2.0   17.0 
13   3.0   16.0 
14   4.0   15.0 
15   5.0   14.0 
16   6.0   13.0 
17   7.0   12.0 
18   8.0   11.0 
19   9.0   10.0 
+0

Diese vielversprechend aussieht, wäre es möglich, diese dynamisch zuweisen zu Datenrahmen 1-12 obwohl? – Kyle

+0

meinst du 'df1',' df10'? Es ist möglich, aber schlechte Übung. – jezrael

+0

Okay, jetzt sehe ich, was Sie tun, ich wusste nicht, dass ein Wörterbuch Datenframes enthalten könnte ... Also habe ich Ihre empfohlene Version implementiert über: d_df = {} für col in model_data.drop (['usrec'], axis = 1) .spalten: für i im Bereich (12,0, -1): d_df ['t' + str (i)] = Modelldaten [col] .shift (i) .add_suffix ('_ t' + str (i)). to_frame() Allerdings wird nur die letzte Spalte der 2300 oder so Spalten im ursprünglichen Datenrahmen beibehalten, ich weiß von der append-Funktion, aber unsicher, ob das hier funktionieren würde, irgendwelche Ideen? – Kyle

Verwandte Themen