2016-05-12 18 views
0

Ich habe einen Datenrahmen, der wie folgt aussieht:Datenrahmen zu Datapanel- in Pandas/Python

Name Permits_13 Score_13 Permits_14 Score_14 Permits_15 Score_15 
0 P.S. 015 ROBERTO CLEMENTE 12.0 284 22 279 32 283 
1 P.S. 019 ASHER LEVY 18.0 296 51 301 55 308 
2 P.S. 020 ANNA SILVER 9.0 294 9 290 10 293 
3 P.S. 034 FRANKLIN D. ROOSEVELT 3.0 294 4 292 1 296 
4 P.S. 064 ROBERT SIMON 3.0 287 15 288 17 291 
5 P.S. 110 FLORENCE NIGHTINGALE 0.0 313 3 306 4 308 
6 P.S. 134 HENRIETTA SZOLD 4.0 290 12 292 17 288 
7 P.S. 137 JOHN L. BERNSTEIN 4.0 276 12 273 17 274 
8 P.S. 140 NATHAN STRAUS 13.0 282 37 284 59 284 
9 P.S. 142 AMALIA CASTRO 7.0 290 15 285 25 284 
10 P.S. 184M SHUANG WEN 5.0 327 12 327 9 327 

Und ich mag, dass es zu einer Datentafelstruktur als Antwort auf diese Frage Fixed effect in Pandas or Statsmodels, zu transformieren, so kann ich Verwenden Sie das PanelOLS mit festen Effekten.

Mein erster Versuch war diese Transformation zu tun:

df1 = df.ix[:,['Permits_13', 'Score_13']].T 
df2 = df.ix[:,['Permits_14', 'Score_14']].T 
df3 = df.ix[:,['Permits_15', 'Score_15']].T 
pf = pandas.Panel({'df1':df1,'df2':df2,'df3':df3}) 

aber es scheint nicht der richtige Weg zu sein, wenn ich keine Informationen über Zeit. Hier repräsentieren die Spalten mit den Ziffern 13, 14 und 15 die Beobachtungen für die Jahre 2013, 2014 und 2015 in dieser Reihenfolge.

Muss ich für jede der Zeilen in den Originaldaten einen Datenrahmen erstellen?

Dies ist meine erste Studie mit Pandas, und jede Hilfe wäre willkommen.

Antwort

0

Das docstring von DataFrame.to_panel() sagt:

langen Transformation (gestapelt) Format (Datenrahmen) in breit (3D, Panel) Format.

Derzeit muss der Index des DataFrame ein 2-Level-MultiIndex sein.

Dieses später verallgemeinert werden kann

So bedeutet, dass Sie tun müssen:

  1. Ihre Datenrahmen Stapel (wie es derzeit ist „breit“, nicht „long“)
  2. zwei Spalten Auswahl, die können einzigartig definiert den Index Ihres Datenrahmen
  3. diese Spalten als Index
  4. Set Anruf to_panel()

Also das ist:

df.stack().set_index(['first_col', 'other_col']).to_panel()