2012-11-04 28 views
5

obrotowy Mam trochę danych radarowych, które jest w trochę dziwnym formacie, a ja nie mogę dowiedzieć się, jak prawidłowo obracać je za pomocą biblioteki pandy.pandy DataFrame problem

moje dane:

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 

Chciałbym kolei, że w DataFrame który wygląda tak:

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

Zrobiłem dużo błahy wokół, ale nie może wydawać aby uzyskać poprawną składnię. Czy ktoś może ci pomóc?

Dzięki!

Odpowiedz

5

Można użyć metody obrotowy tutaj:

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 ... dobra sztuczka. Dzięki! –

+0

dostaję wynik „ReshapeError: Index zawiera zduplikowane wpisy, nie może przekształcić”. Niektóre z moich lokalizacji są ciągami zawierającymi spacje, czy może to być powiązane? –

+0

Ye. Nie działa też dla mnie. Otrzymuję 'ReshapeError: Index zawiera zduplikowane wpisy, nie może zmienić kształtu'. –

3

Zakładając, że źródło danych w pliku csv,

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 

pamiętać, że nie określiła loc jako indeks jeszcze więc używa indeksu AutoIncrement całkowitą.

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

Jednakże, jeśli ramka danych używa już loc jako wskaźnik, musimy dołączyć kolumnę time do niego tak, że mamy indeks hierarchiczny loc czasie. Można to zrobić przy użyciu nowego append opcję w metodzie set_index. Tak: -

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

w każdym przypadku powinniśmy dojść do tego scenariusza: -

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 

Nadzieja to pomaga.

+0

To jest wielki, dzięki! Mój błąd polega na tym, że nie używam wywołania sortlevel(). To_panel(). Czytając tę ​​część dokumentacji pandy teraz ... Jeszcze raz dziękuję! –

+0

Witamy. Cieszę się, że pomaga! Zwróć uwagę, że dla twojej ramki danych nie masz indeksu autoregulacji. Tak więc zredagowałem swoją odpowiedź, aby zasugerować użycie opcji 'append = True' przy dodawaniu" czasu "do istniejącego indeksu" loc ". –

+1

Gdybym chciał uzyskać szereg obiektów wszystkich prędkości dla danej lokalizacji, co ma składnia wygląda? IE, jak mogę pobrać wiersz z panelu? –