然后筛选对多级索引Dataframe进行排名

时间:2016-01-13 14:47:57

标签: python pandas

我有一个带有两列(Col1和Col2)的pandas Dataframe和一个多级索引(Date和Symbol),如下所示:

    df = pd.DataFrame({'Date': ['2015-12-01']*3 + ['2015-11-02']*3 + ['2015-10-01']*3,
                    'Symbol': ['AAA','BBB','CCC']*3,
                    'Col1': 0.45,-1.02,-0.41,0.59,-2.16,-1.02,-0.44,0.52,-1.76],
                    'Col2': [0.53,-0.57,0.3,-0.42,-0.77,1.09,-0.88,0.27,0.63]},
                     ).set_index(['Date', 'Symbol'])

复制此Dataframe的代码是:

                 Col1   Col2    Rank
Date     Symbol         
2015-12-01  AAA  0.45    0.53   1
            CCC -0.41    0.30   2
            BBB -1.02   -0.57   NaN
2015-11-02  CCC -1.02    1.09   1
            AAA  0.59   -0.42   2
            BBB -2.16   -0.77   NaN
2015-10-01  BBB  0.52    0.27   1
            AAA -0.44   -0.88   2
            CCC -1.76    0.63   NaN

在每个日期内,我试图根据Col1中的最大值选择前n行(在本例中为2),然后根据Col2中的值对这些行进行排名(最大== 1,第二大) == 2等)。将结果作为列添加到原始Dataframe中,最终的Dataframe应如下所示:

df.reset_index().groupby(['Date'])['Col1'].nlargest(2)

我尝试过使用groupby和rank函数,但我很难正确编制索引。

例如,Date 2015-10-01 7 0.52 6 -0.44 2015-11-02 3 0.59 5 -1.02 2015-12-01 0 0.45 2 -0.41 产生:

{{1}}

但是我无法弄清楚如何对结果进行排名并将结果放回到Dataframe中。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

 df['largest'] = df.groupby(level='Date').apply(lambda x: x.Col1.nlargest(2)).reset_index(0, drop=True)
 df['ranked'] = df.groupby(level='Date').apply(lambda x: x.dropna(subset=['largest']).Col2.rank(ascending=False)).reset_index(0, drop=True)

得到:

                   Col1  Col2  largest  ranked
Date       Symbol                             
2015-12-01 AAA     0.45  0.53     0.45       1
           BBB    -1.02 -0.57      NaN     NaN
           CCC    -0.41  0.30    -0.41       2
2015-11-02 AAA     0.59 -0.42     0.59       2
           BBB    -2.16 -0.77      NaN     NaN
           CCC    -1.02  1.09    -1.02       1
2015-10-01 AAA    -0.44 -0.88    -0.44       2
           BBB     0.52  0.27     0.52       1
           CCC    -1.76  0.63      NaN     NaN