2016-02-22 17 views
2

源數據:如何用MultiIndex.from_product重新索引?

data = pandas.DataFrame(
[["bainuo","pay",2418,2811,0], 
["ctrip_distributor","pay",468,613,0], 
["bainuo","refund",855,1001,231], 
["ctrip_distributor","refund",195,264,55], 
["dianpinghotel","refund",53,60,52], 
["bainuo","check_in",1705,1888,184], 
["ctrip_distributor","check_in",264,313,73], 
["dianpinghotel","check_in",5,5,4]],columns=["partner","state","oid","quantity","roomnight"]) 

我想:

data = pandas.pivot_table(data,values=['oid','quantity','roomnight'],index=['partner'],columns=['state']) 
data = data.reorder_levels([1,0],axis=1).reindex(columns=['oid','quantity','roomnight'],level=1).reindex(columns=['pay','refund','check_in'],level=0).fillna(0) 

和它的作品 但是當我嘗試另一種方式:

data = pandas.pivot_table(data,values=['oid','quantity','roomnight'],index=['partner'],columns=['state']) 
idx = pandas.MultiIndex.from_product([['pay','refund','check_in'],['oid','quantity','roomnight']]) 
data = data.reindex(columns=idx) 

的結果是錯誤的!

+0

雖然他們有根本不同的方法,但在成功的版本中,您正在創建數據透視表並在數據透視表之後重新排序級別,在第二次您將數據重新索引並且不存在與列的數據關係所以你得到所有'NaN's – EdChum

+0

@EdChum對不起,有一支筆,請再看一遍,謝謝 –

+1

你首先需要做''.reorder_levels([1,0],axis = 1)''在第二種情況下,那麼帶有MultiIndex的'reindex'將起作用(reindex不能交換關卡,它會嘗試匹配關卡內的標籤,因此你會得到所有的NaN) – joris

回答

2

你首先需要做.reorder_levels([1,0],axis=1)以及在第二種情況下,則具有多指標重新索引將工作:

data.reorder_levels([1,0],axis=1).reindex(columns=idx) 

的原因是reindex不能互換的水平,它只會嘗試匹配標籤在水平之內,所以你得到所有的NaNs。