2015-10-18 138 views
0

我有一個帶有重複索引的pandas DataFrame。每個索引有3行,它們對應於一組項目。有兩列,分別是ab將pandas DataFrame按多列和重複索引排序

df = pandas.DataFrame([{'i': b % 4, 'a': abs(b - 6) , 'b': b} 
         for b in range(12)]).set_index('i') 

我想,這樣的數據幀進行排序:

  1. 都具有相同的指數行是相鄰的。 (所有組合在一起)
  2. 這些組按組內的最低值a以相反順序排列。

例如,在上述df,前三項應與索引0的那些,因爲對於這三行中的最低a值是2,並且所有其它基團具有至少一個行同一個a值低於2.後三個項目可能是組3或組1,因爲這兩個組中的最低a值是1.最後一組項目應該是組2,因爲它有一行a的值爲0.

  1. 在每個組中,項目按升序排序b

所需的輸出:

 
    a b 
i 
0 6 0 
0 2 4 
0 2 8 
3 3 3 
3 1 7 
3 5 11 
1 5 1 
1 1 5 
1 3 9 
2 4 2 
2 0 6 
2 4 10 

我一直是這樣的:

df.groupby('i')[['a']].transform(min).sort(['a', 'b'], ascending=[0, 1]) 

但它給了我一個KeyError異常,而它只是變得那麼遠,如果我做i列無論如何,而不是索引。

回答

2

最直接的方式,我看到的是移動你的索引列,並計算與羣分的新列。

In [43]: df = df.reset_index() 

In [45]: df['group_min'] = df.groupby('i')['a'].transform('min') 

然後,你可以通過你的條件進行排序:

In [49]: df.sort_values(['group_min', 'i', 'b'], ascending=[False, False, True]) 
Out[49]: 
    i a b group_min 
0 0 6 0   2 
4 0 2 4   2 
8 0 2 8   2 
3 3 3 3   1 
7 3 1 7   1 
11 3 5 11   1 
1 1 5 1   1 
5 1 1 5   1 
9 1 3 9   1 
2 2 4 2   0 
6 2 0 6   0 
10 2 4 10   0 

要回到你想要的框架,下降跟蹤變量和重置索引。

In [50]: df.sort_values(['group_min', 'i', 'b'], ascending=[False, False, True]).drop('group_min', axis=1).set_index('i') 
Out[50]: 
    a b 
i  
0 6 0 
0 2 4 
0 2 8 
3 3 3 
3 1 7 
3 5 11 
1 5 1 
1 1 5 
1 3 9 
2 4 2 
2 0 6 
2 4 10 
3

你可以先排序a降序排序,然後排序索引:

>>> df.sort(['a', 'b'], ascending=[False, True]).sort_index() 
    a b 
i  
0 6 0 
0 2 4 
0 2 8 
1 5 1 
1 3 9 
1 1 5 
2 4 2 
2 4 10 
2 0 6 
3 5 11 
3 3 3 
3 1 7 
+0

謝謝!這只是錯過了最後的標準,這些項目也是按「b」組排序的。 – user2034412

+0

我沒有看到。修改爲包含'b'。 – Alexander

相關問題