首页 > 解决方案 > 混合 .loc 和 .iloc 切片以选择索引子级别的前 n 行

问题描述

在此处输入图像描述

我有一个多级索引。我想选择每种样式的前两行(以黄色突出显示的示例)。DataFrame的一种.iloc[:, :2],但它不起作用。

另一种变体是在索引的顶层.loc只选择某些,然后选择内层的第一行。例如,“前 2 行 'fox' 和 'bear' 样式。style.iloc[:n]nbureau

当我想根据标签对所有内容进行切片时,我可以使用IndexSlice它,但我找不到基于位置的切片或混合标签和基于位置的切片的等价物。

import numpy as np
tuples = [
    ('fox', 'anton1'),
    ('fox', 'anton2'),
    ('fox', 'anton3'),
    ('fox', 'anton4'),
    ('bat', 'girv2'),
    ('bat', 'girv3'),
    ('bat', 'girv4'),
    ('bat', 'girv5'),
    ('bear', 'kalg1'),
    ('bear', 'kalg2'),
    ('bear', 'kalg3'),
    ('bear', 'kalg4'),
]
np.random.seed(1)
data = np.random.rand(12,1)
mix = pd.MultiIndex.from_tuples(tuples, names=('style', 'bureau'))

df = pd.DataFrame(index=mix, data=data, columns=['foo'])

标签: pandas

解决方案


您可以使用.GroupBy.head

df.groupby(level='style').head(2)

这是另一种方式:

df.groupby(level='style').apply(lambda d: d.iloc[2:4]).droplevel(0)

推荐阅读