2017-08-20 1 views
1

Ich bin ziemlich neu zu Pandas DataFrame, aber ich habe Tutorials und das Lesen von Dokumentation darüber beobachtet und ich kann nicht vollständig herausfinden, wie ich tun kann, was ich will. Ich habe einen DataFrame, der nach Zeitstempeln indiziert ist, und ich möchte einen bestimmten Zeitraum in eine einzelne Zeile einteilen. Grafisch:Wie erzeuge ich einen neuen Pandas-Datenrahmen, wo ich einige Zeilen in eine neue Spalte komprimiere?

# start date of the series 
start_date='20130101' 
# range of dates 
dates = pd.date_range(start_date, periods=6) 

# random dataframe 
df = pd.DataFrame([["(1,1)","(1,2)"], 
        ["(2,1)","(2,2)"], 
        ["(3,1)","(3,2)"], 
        ["(4,1)","(4,2)"], 
        ["(5,1)","(5,2)"], 
        ["(6,1)","(6,2)"]], index=dates, columns=list('AB')) 
print(df) 
# range of bucketing periods, in this case I will get just three periods covering two days each 
rng = pd.period_range(start_date, periods=3,freq='2D') 

Dies führt zu

   A  B 
2013-01-01 (1,1) (1,2) 
2013-01-02 (2,1) (2,2) 
2013-01-03 (3,1) (3,2) 
2013-01-04 (4,1) (4,2) 
2013-01-05 (5,1) (5,2) 
2013-01-06 (6,1) (6,2) 

Was würde ich tun möchte, ist nun einen neuen Datenrahmen zu erzeugen, wo ich die Perioden in rng = pd.period_range(start_date, periods=3,freq='2D') als Indizes habe und die Zeilen zu dieser Zeit als aufeinanderfolgende entsprechenden Spalten:

   A  B  A1  B1 
2013-01-01 (1,1) (1,2) (2,1) (2,2)    
2013-01-03 (3,1) (3,2) (4,1) (4,2) 
2013-01-05 (5,1) (5,2) (6,1) (6,2) 

gibt es eine Methode in der Api, dass ich diese verwenden kann, zu tun? Ich stelle mir vor, ich brauche auch neue Etiketten wie A1, B1 zu generieren.

Auch nachdem ich ein bisschen mehr dachte, ich kann wahrscheinlich mit

   A  A1  B  B1 
2013-01-01 (1,1) (2,1) (1,2) (2,2)    
2013-01-03 (3,1) (4,1) (3,2) (4,2) 
2013-01-05 (5,1) (6,1) (5,2) (6,2) 
+0

Wie werden die Zeiträume festgelegt? –

+0

Die Zeiträume stammen aus dem oben definierten Zeitraumbereich. Ich nehme es als eine 2d Periode für dieses Beispiel. – Paco

+0

Ich frage, weil was Sie wollen, kann durch eine einfache Umgestaltung erreicht werden: 'pd.DataFrame (np.reshape (df.values, (-1, 4)))' –

Antwort

2

Einer der Art und Weise zu tun ist, indem sie die Zeiträume timestamp Umwandlung und machen eine Datenrahmen dann concating sie NaN mit ffill Methode Füllen und reshape based on index durch den neuen Zeitmarkenspalte als Index dh Einstellung

n = pd.DataFrame(rng.to_timestamp()).set_index(rng.to_timestamp()) 

result = pd.concat([df, n], axis=1).fillna(method='ffill').set_index(0) 

result = result.set_index(result.groupby(level=0).cumcount(), append=True).unstack() 

Output

 
       A    B  
       0  1  0  1 
0          
2013-01-01 (1,1) (2,1) (1,2) (2,2) 
2013-01-03 (3,1) (4,1) (3,2) (4,2) 
2013-01-05 (5,1) (6,1) (5,2) (6,2) 
In [1024]: 


+0

Genau das habe ich gesucht. Vielen Dank. – Paco

+0

Froh, @ Paco zu helfen – Dark

Verwandte Themen