2017-07-19 152 views
3

排序下面是代碼:如何透視表中熊貓

test = pd.DataFrame({'country':['us','ca','ru','cn','ru','cn','us','ca','ru','cn','us','ca','ru','cn','us','ca'], 'month':[5,6,7,5,6,7,5,5,6,7,5,6,6,5,5,6], 'id':[x for x in range(16)]}) 
p = test.pivot_table(index=['month', 'country'], aggfunc='count')[['id']] 

輸出看起來是這樣的:

enter image description here

我想通過id列排序表,所以最大的數字出現在頂部,如:

    id 
month country 
      us  4 
    5  cn  2 
      ca  1 

回答

1

您需要DataFrame.reset_indexDataFrame.sort_valuesDataFrame.set_index

p1 = p.reset_index() 
     .sort_values(['month','id'], ascending=[1,0]) 
     .set_index(['month','country']) 
print (p1) 
       id 
month country  
5  us  4 
     cn  2 
     ca  1 
6  ca  3 
     ru  3 
7  cn  2 
     ru  1 

因爲這個解決方案不通過id索引內由month水平定義的基團內工作:(

p1 = p.sort_index(level='month', sort_remaining=True) \ 
     .sort_values('id', ascending=False) 
print (p1) 
       id 
month country  
5  us  4 
6  ca  3 
     ru  3 
5  cn  2 
7  cn  2 
5  ca  1 
7  ru  1 
+0

是非工作解決方案的一個錯誤? –

+0

@ScottBoston - 真的很難回答,我試着在pandas github上找到一些問題,但是很不自然。 :( – jezrael

1

選項1
這種種

p.groupby(
    level='month', group_keys=False 
).apply(pd.DataFrame.sort_values, by='id', ascending=False) 

       id 
month country  
5  us  4 
     cn  2 
     ca  1 
6  ca  3 
     ru  3 
7  cn  2 
     ru  1 

選項2
該第一排序由id整個數據幀然後由索引內的month水平再次排序。但是,我不得不使用sort_remaining=False作爲自我解釋的原因,kind='mergesort'因爲mergesort是穩定的排序,並且不會混淆'月'級定義的組中的預先存在的順序。

p.sort_values('id', ascending=False) \ 
.sort_index(level='month', sort_remaining=False, kind='mergesort') 

       id 
month country  
5  us  4 
     cn  2 
     ca  1 
6  ca  3 
     ru  3 
7  cn  2 
     ru  1 

選項3
這將使用numpy的的lexsort ......這個工作,但因爲它依賴於id是數字和我能夠把負的面前我不喜歡它它的下降順序。 /聳聳肩

p.iloc[np.lexsort([-p.id.values, p.index.get_level_values('month')])] 

       id 
month country  
5  us  4 
     cn  2 
     ca  1 
6  ca  3 
     ru  3 
7  cn  2 
     ru  1