2014-03-06 74 views
3

我有一個使用pivot_table方法創建的熊貓數據框。它的結構如下:重新排列熊貓數據透視表中的列

import numpy as np 
import pandas 

datadict = { 
('Imps', '10day avg'): {'All': '17,617,872', 'Crossnet': np.nan, 'N/A': '17,617,872'}, 
('Imps', '30day avg'): {'All': '17,302,111', 'Crossnet': '110','N/A': '18,212,742'}, 
('Imps', '3day avg'): {'All': '8,029,438', 'Crossnet': '116', 'N/A': '8,430,904'}, 
('Imps', 'All'): {'All': '14,156,666', 'Crossnet': '113', 'N/A': '14,644,823'}, 
('Spend', '10day avg'): {'All': '$439', 'Crossnet': np.nan, 'N/A': '$439'}, 
('Spend', '30day avg'): {'All': '$468', 'Crossnet': '$0', 'N/A': '$492'}, 
('Spend', '3day avg'): {'All': '$209', 'Crossnet': '$0', 'N/A': '$219'}, 
('Spend', 'All'): {'All': '$368', 'Crossnet': '$0', 'N/A': '$381'} 
} 
df = pandas.DataFrame.from_dict(datadict) 
df.columns = pandas.MultiIndex.from_tuples(df.columns) 

我試圖重新安排下,在新秩序「花」和「小鬼」同時使用的以下方法,嵌套列然而,儘管被拋出任何錯誤的順序保持不變:

df['Spend']=df['Spend'].reindex_axis(['3day avg','10day avg','30day avg','All'],axis=1) 
df['Spend']=df['Spend'][['3day avg','10day avg','30day avg','All']] 

回答

3

的一種方法是通過創建多指標,並重新索引:

In [11]: mi = pd.MultiIndex.from_product([['Imps', 'Spend'], ['3day avg','10day avg','30day avg','All']]) 

In [12]: df.reindex_axis(mi, 1) 
Out[12]: 
       Imps          Spend       
      3day avg 10day avg 30day avg   All 3day avg 10day avg 30day avg All 
All  8,029,438 17,617,872 17,302,111 14,156,666  $209  $439  $468 $368 
Crossnet  116   NaN   110   113  $0  NaN  $0 $0 
N/A  8,430,904 17,617,872 18,212,742 14,644,823  $219  $439  $492 $381 

注:MultiIndex.from_product是新在0.13,如果y你使用比pd.MultiIndex.from_tuples(list(itertools.product(..)))更早的熊貓。

+0

我在熊貓0.11,所以我想我堅持第二個解決方案。任何原因,甚至在新版本中沒有內置的方法來做到這一點? – ChrisArmstrong

+0

@ChrisArmstrong它可能是一個整潔的方式,當然好像可能會有。可能值得在github上發佈enh請求: –

+0

我嘗試了這樣的解決方案:mi = pd.MultiIndex.from_tuples(list(itertools.product([['Imps','Spend'],['3day avg','10day avg','30day avg','All']])))。這是正確的,因爲我在進行下一步時遇到錯誤df.reindex_axis(mi,1) – ChrisArmstrong