2013-12-23 34 views
3

我有一個6列的數據框。前5個唯一標識一個觀察。第六是這個觀察的價值。我想旋轉數據,以便在5個標識列中,3個成爲分層行索引,而其他2個成爲分層列索引。重塑Pandas中的數據(多列索引,也可能在行中)

具體地,具有以下設置:

import numpy as np 
import pandas as pd 
from itertools import product 

np.random.seed(1) 

team_names = ['Yankees', 'Mets', 'Dodgers'] 
jersey_numbers = [35, 71, 84] 
game_numbers = [1, 2] 
observer_names = ['Bill', 'John'] 
observation_types = ['Speed', 'Strength'] 

row_indices = list(product(team_names, jersey_numbers, game_numbers, observer_names, observation_types)) 
observation_values = np.random.randn(len(row_indices)) 

tns, jns, gns, ons, ots = zip(*row_indices) 

data = pd.DataFrame({'team': tns, 'jersey': jns, 'game': gns, 'observer': ons, 'obstype': ots, 'value': observation_values}) 

我想重塑數據,使得行是teamjerseygame而列是observerobstype。以下似乎完成了這項工作:

pd.pivot_table(data, values='value', cols=['observer', 'obstype'], rows=['team', 'jersey', 'game']) 

是否有任何其他方式來做這種事情?我最初嘗試將除value以外的所有列放入索引,然後使用unstack(['observer', 'obstype'])。但是這給了我一個不必要的額外的級別在我的列層次結構中:一個未命名的級別,其唯一的條目是value(即我的表中膽量實際需要的列的名稱)。

什麼是正確的方式來處理這種情況?就像我上面所做的那樣,只是使用pivot_table?還是有更好的一般策略?

+0

兩種聲音的權利。除了長行很難閱讀([PEP 8](http://www.python.org/dev/peps/pep-0008/)):*限制所有行最多79個字符*) – dmvianna

+0

如果我使用「創建一個巨大的索引,然後取消堆棧」方法,我該如何殺死列層次結構中的額外級別? – 8one6

回答

4

我也認爲這兩個都是很好的和有價值的選擇。
而在unstack的情況下襬脫了額外級別的,你可以使用droplevel

>>> data = data.unstack(['observer', 'obstype']) 
>>> data.columns = data.columns.droplevel(0) 
>>> data 
observer     Bill    John   
obstype     Speed Strength  Speed Strength 
game jersey team           
1 35  Dodgers -0.110447 -0.617362 0.562761 0.240737 
      Mets -0.517094 -0.997027 0.248799 -0.296641 
      Yankees 0.520576 -1.144341 0.801861 0.046567 
    71  Dodgers 1.904659 1.111057 0.659050 -1.627438 
      Mets  2.190700 -1.896361 -0.646917 0.901487 
      Yankees 0.529465 0.137701 0.077821 0.618380 
    84  Dodgers -0.400878 0.824006 -0.562305 1.954878 
      Mets  1.331457 -0.287308 0.680070 -0.319802 
      Yankees 1.038825 2.186980 0.441364 -0.100155 
2 35  Dodgers 0.280665 -0.073113 1.160339 0.369493 
      Mets  0.495211 -0.174703 0.986335 0.213534 
      Yankees -0.186570 -0.101746 0.868886 0.750412 
    71  Dodgers 0.602319 0.420282 0.810952 1.044442 
      Mets  2.528326 -0.248635 0.043669 -0.226314 
      Yankees 0.232495 0.682551 -0.310117 -2.434838 
    84  Dodgers -1.331952 -1.760689 -1.650721 -0.890556 
      Mets -1.272559 0.313548 0.503185 1.293226 
      Yankees -0.136445 -0.119054 0.017409 -1.122019 

[18 rows x 4 columns] 
+2

這將成爲當天最令人頭痛的問題:如何幹淨地將數據框粘貼到StackOverflow響應中?我正在使用iPython Notebook,但我願意使用其他工具來完成上面所做的很好的工作。 – 8one6

+4

不是一個愚蠢的問題!因爲確實,當你從筆記本中複製出來的時候(好的html表格),它看起來不太好。你把它像照片一樣粘貼的方式看起來不錯,但我想有點麻煩。當我在這裏回答問題時,我經常去一個普通的終端,所以我可以很容易地複製它。或者在筆記本中,您也可以執行'print df.to_string()',您將獲得相同的純文本repr而不是html表格。 – joris

相關問題