考虑数据帧df

mux = pd.MultiIndex.from_arrays([
    list('aaaabbbbbccdddddd'),
    list('tuvwlmnopxyfghijk')
], names=['one', 'two'])

df = pd.DataFrame({'col': np.arange(len(mux))}, mux)

df

         col
one two
a   t      0
    u      1
    v      2
    w      3
b   l      4
    m      5
    n      6
    o      7
    p      8
c   x      9
    y     10
d   f     11
    g     12
    h     13
    i     14
    j     15
    k     16


如果按索引的第一级分组,如何优雅地获得前两组的前两行:

         col
one two
a   t      0
    u      1
b   l      4
    m      5

最佳答案

选项1
您可以使用列表组合和pd.concat

pd.concat([g.head(2) for _, g in df.groupby(level=0)][:2])

         col
one two
a   t      0
    u      1
b   l      4
    m      5


由于完成列表补偿是不必要的开销,因此可以使用itertools.takewhile来防止这种情况。

it = itertools.takewhile(lambda x: x[0] < 2, enumerate(df.groupby(level=0)))
pd.concat([g.head(2) for _, (_, g) in it])

         col
one two
a   t      0
    u      1
b   l      4
    m      5




选项2
我想到的另一种可能的解决方案是对df进行预过滤,以仅保留索引级别0的前两个值的行,然后执行groupby。

# https://stackoverflow.com/a/46900625/4909087
df.loc[df.index.levels[0][:2].values].groupby(level=0).head(2)

         col
one two
a   t      0
    u      1
b   l      4
    m      5

关于python - 从前两个组中获取前两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46900357/

10-09 20:19