2012-11-04 25 views
5

Ich habe einige Radardaten, die in einem etwas seltsamen Format sind, und ich kann nicht herausfinden, wie man es richtig mit der Pandas-Bibliothek dreht.Pandas DataFrame Pivot-Problem

Meine Daten:

speed time 
loc  
A 63 0000 
B 61 0000 
C 63 0000 
D 65 0000 
A 73 0005 
B 71 0005 
C 73 0005 
D 75 0005 

ich, dass in einem Datenrahmen drehen möchte, der wie folgt aussieht:

0000 0005 
loc  
A 63  73 
B 61  71 
C 63  73 
D 65  75 

ich um getan habe viel Hantieren aber kann nicht scheinen, um die Syntax korrekt zu machen. Kann mir bitte jemand helfen?

Danke!

Antwort

5

können Sie die Pivot-Methode hier verwenden:

In [71]: df 
Out[71]: 
    speed time 
loc    
A  63  0 
B  61  0 
C  63  0 
D  65  0 
A  73  5 
B  71  5 
C  73  5 
D  75  5 

In [72]: df.reset_index().pivot('loc', 'time', 'speed') 
Out[72]: 
time 0 5 
loc   
A  63 73 
B  61 71 
C  63 73 
D  65 75 
+0

ah ... guter Trick. Vielen Dank! –

+0

Ich bekomme ein Ergebnis von "ReshapeError: Index enthält doppelte Einträge, kann nicht umformen". Einige meiner Orte sind Strings mit Leerzeichen in ihnen, könnte das verwandt sein? –

+0

Ye. Funktioniert auch nicht für mich. Ich bekomme 'ReshapeError: Index enthält doppelte Einträge, kann nicht umgestalten'. –

3

Unter der Annahme, Quelle Ihrer Daten in einer CSV-Datei,

from pandas.io.parsers import read_csv 
df = read_csv("radar_data.csv") 

df # shows what is in df 

     loc speed time 
0 A  63  0 
1 B  61  0 
2 C  63  0 
3 D  65  0 
4 A  73  5 
5 B  73  5 
6 C  75  5 
7 D  75  5 
8 A  67  0 
9 B  68  0 
10 C  68  0 
11 D  70  0 

Bitte beachte, dass ich nicht loc als der Index noch festgelegt haben, so dass es einen autoincrement Integer-Index verwendet.

panel = df.set_index(['loc', 'time']).sortlevel(0).to_panel() 

Allerdings, wenn Ihr Datenrahmen bereits loc als Index verwendet wird, müssen wir die time Säule hinein anhängen, so dass wir eine Lok-Zeit hierarchal Index haben. Dies kann mit der neuen append Option in der set_index Methode erfolgen. Wie folgt aus: -

panel = df.set_index(['time'], append=True).sortlevel(0).to_panel() 

In jedem Fall sollten wir bei diesem Szenario kommen: -

panel # shows what panel is 

<class 'pandas.core.panel.Panel'> 
Dimensions: 1 (items) x 4 (major) x 2 (minor) 
Items: speed to speed 
Major axis: A to D 
Minor axis: 0 to 5 

panel["speed"] # <--- This is what you are looking for. 


time 0 5 
loc   
A  63 67 
B  73 61 
C  68 73 
D  63 68 

Hoffnung, das hilft.

+0

, der groß ist, danke! Mein Fehler war, den Aufruf sortlevel(). To_panel() nicht zu verwenden. Lesen Sie jetzt diesen Teil der Pandas-Dokumentation ... Danke nochmal! –

+0

Willkommen. Froh, dass es hilft! Beachten Sie, dass Sie für Ihren Datenrahmen nicht über den Autoinkrement-Index verfügen. Daher habe ich meine Antwort so bearbeitet, dass Sie vorschlagen, dass Sie die Option "append = True" verwenden, während Sie "time" in Ihren vorhandenen "loc" -Index einfügen. –

+1

Wenn ich ein Series-Objekt mit allen Geschwindigkeiten für eine bestimmte Position erhalten möchte, wie sieht die Syntax dann aus? IE, wie kann ich eine Zeile aus dem Panel abrufen? –