2015-12-15 58 views
2

這是一個帶有多索引行的DataFrame示例。Python和Pandas:對多索引中的每一行進行排序DataFrame

row_idx_arr = list(zip(['r0', 'r0', 'r0', 'r1', 'r1', 'r1', 'r2', 'r2', 'r2', 'r3', 'r3', 'r3'], ['r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', ])) 
row_idx = pd.MultiIndex.from_tuples(row_idx_arr) 

d = pd.DataFrame((np.random.randn(36)*10).reshape(12,3), index=row_idx, columns=['c0', 'c1', 'returns']) 


       c0   c1 returns 
r0 r-00 3.553446 5.434018 5.141394 
    r-01 10.045250 18.453873 13.170396 
    r-02 -7.231743 -11.695715 5.303477 
r1 r-00 -1.302917 6.461693 15.016544 
    r-01 13.348552 -9.133629 -2.464875 
    r-02 11.157144 16.833344 -8.745151 
r2 r-00 -10.937900 -14.829996 -8.457521 
    r-01 -7.495922 9.269724 -5.001560 
    r-02 -8.966551 11.063291 -2.420552 
r3 r-00 -21.434668 -0.730560 5.550830 
    r-01 16.590447 -0.432384 -0.396881 
    r-02 -0.636957 -2.765959 2.591906 

我想創建一個新的數據幀,其中,每行(R0,R1,R2,R3),我有2項(級別2行:R-00,R-01,R -02)具有最高的「回報」。

請注意,這是一個例子,在我的程序中我有成千上萬的行。

+0

鑑於您的數據集,您的預期輸出是什麼? – Alexander

回答

3

我認爲你可以使用nlargestgroupby

import pandas as pd 
import numpy as np 

row_idx_arr = list(zip(['r0', 'r0', 'r0', 'r1', 'r1', 'r1', 'r2', 'r2', 'r2', 'r3', 'r3', 'r3'], ['r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', 'r-00', 'r-01', 'r-02', ])) 
row_idx = pd.MultiIndex.from_tuples(row_idx_arr) 

d = pd.DataFrame((np.random.randn(36)*10).reshape(12,3), index=row_idx, columns=['c0', 'c1', 'returns']) 
print d 
       c0   c1 returns 
r0 r-00 -13.417493 -14.758075 -3.650524 
    r-01 1.092054 -1.224499 -8.968738 
    r-02 4.793562 -9.958708 -16.554163 
r1 r-00 -0.308835 -4.584725 -4.070714 
    r-01 -23.764872 0.240768 -24.110720 
    r-02 -4.054037 7.744689 12.762280 
r2 r-00 9.160783 -16.041333 10.865837 
    r-01 -10.472071 -1.625311 17.091514 
    r-02 -13.009323 1.114351 -3.494279 
r3 r-00 7.537877 -17.307256 -2.739447 
    r-01 -1.107766 1.458901 -19.214064 
    r-02 8.473581 -7.456646 1.427752 
df = d.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, ['returns'])) 
print df 
       c0   c1 returns 
r0 r-00 -13.417493 -14.758075 -3.650524 
    r-01 1.092054 -1.224499 -8.968738 
r1 r-02 -4.054037 7.744689 12.762280 
    r-00 -0.308835 -4.584725 -4.070714 
r2 r-01 -10.472071 -1.625311 17.091514 
    r-00 9.160783 -16.041333 10.865837 
r3 r-02 8.473581 -7.456646 1.427752 
    r-00 7.537877 -17.307256 -2.739447 
+0

非常感謝您的回答,那就是我一直在尋找的 – luca

0

最優雅的方式將以下內容:

d.groupby(axis=0, level=0, group_keys=False).nlargest(2, 'returns') 

遺憾的是不工作,因爲DataFrameGroupBy(對象根據groupby返回)在Pandas API中還沒有實現最大的方法。

但這裏是一個解決辦法:

larg = d['returns'].groupby(level=0, group_keys=False).nlargest(2) 
d.ix[larg.index] 

做是因爲GROUPBY應用於一系列還給已經nlargest法實施SeriesGroupBy對象。

相關問題