然后对多级索引数据帧进行筛选



我有一个熊猫数据帧,其中包含两列(Col1 和 Col2)和一个多级索引(日期和符号),如下所示:

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

用于复制此数据帧的代码为:

    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'])

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

                 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

我尝试使用分组依据和排名函数,但很难正确编制索引。

例如,df.reset_index().groupby(['Date'])['Col1'].nlargest(2)产生:

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

但是我不知道如何排名并将结果放回数据帧中。

您可以执行以下操作:

 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

最新更新