2012-11-04 155 views
5

我有一些雷達數據有點奇怪的格式,我不知道如何正確地使用熊貓庫來支持它。熊貓DataFrame pivoting問題

我的數據:

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 

我希望把它轉換成一個數據幀,看起來像這樣:

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

我已經做了擺弄周圍的很多,但似乎無法得到正確的語法。任何人都可以幫忙嗎?

謝謝!

回答

5

你可以在這裏使用樞軸方法:

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

啊......好戲。謝謝! –

+0

我得到「ReshapeError:索引包含重複條目,無法重新塑造」的結果。我的一些位置是帶有空格的字符串,可能是相關的嗎? –

+0

葉。對我也不起作用。我得到'ReshapeError:索引包含重複的條目,也無法重塑。 –

3

假設您的數據源是一個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 

請注意,我沒有設置loc作爲指標又那麼它使用一個自動增量整數索引。

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

但是,如果你的數據幀已經使用loc爲指標,我們需要將time列追加到其中,因此,我們有一個LOC-時間分級指數。這可以使用​​方法中的新append選項完成。像這樣的: -

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

在任何情況下,我們應該在這種情況下到達: -

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 

希望這有助於。

+0

這是偉大的,謝謝!我的錯誤是沒有使用sortlevel()。to_panel()調用。現在閱讀熊貓文檔的這一部分...再次感謝! –

+0

歡迎。很高興幫助!請注意,對於您的數據框,您沒有自動增量索引。所以我編輯了我的答案,建議您在'loc'索引中添加'time'的同時使用'append = True'選項。 –

+1

如果我想獲得給定位置的所有速度的Series對象,那麼語法是什麼樣的? IE,我如何從面板中檢索一行? –