如何从Pandas多级数据框中获取有序子集

时间:2017-08-01 11:40:03

标签: pandas sorting dataframe

我有一个大表,看起来像这样:

enter image description here

上图仅显示了表格的正面部分。

现在我想按照降序排序“201723”栏目中的表格,并且只从整个表格中取出前5行。

我尝试了以下代码:

def func(x):
    return x.sort_values(by='201723',ascending=False)[:5]

bcom_hang_tbl.groupby(['h_platformid', 'model']).apply(func) 

导致:

[![在此处输入图像说明] [2]] [2]

这不是我想要的,因为h_platformid和模型索引是重复的。

我尝试了另一个这样的:

def func(x):
    return x.sort_values(by='201723',ascending=False)[:5]

bcom_hang_tbl.groupby(['h_platformid', 'model'], as_index=False).apply(func)

我得到了更好的结果: [![在此处输入图像说明] [3]] [3]

但由于新添加的整数索引如上图中的红色所示,它仍然不能令人满意。

我终于尝试了这个:

def func(x):
    x = x.sort_values(by='201723',ascending=False)[:5]
    return x.loc[:, 'ld_fwv':]

bcom_hang_tbl.reset_index().groupby(['h_platformid', 'model']).apply(func).loc[:, 'ld_fwv':]

仍然无效: [![在此处输入图像说明] [4]] [4]

我怎么能这样做?

@MaxU,抱歉,我犯了一个错误。我将我的小样本数据改为:

index = pd.MultiIndex.from_arrays([['X', 'X', 'X', 'Y', 'Y','Y'], [1, 3, 5, 1, 3, 5]], names=['M1', 'M2'])

df = pd.DataFrame(np.arange(30).reshape(6,5), columns=list('ABCDE'), index=index)

df.groupby('M1').apply(lambda x: x.nlargest(2, 'A'))

现在结果如下: enter image description here

与大表示例中一样,索引M1是重复的。

1 个答案:

答案 0 :(得分:1)

IIUC我们可以使用DataFrame.nlargest()方法:

In [56]: df.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, 'A'))
Out[56]:
        A   B   C   D   E
M1 M2
X  5   10  11  12  13  14
   3    5   6   7   8   9
Y  5   25  26  27  28  29
   3   20  21  22  23  24