我有一个大表,看起来像这样:
上图仅显示了表格的正面部分。
现在我想按照降序排序“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'))
与大表示例中一样,索引M1是重复的。
答案 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