基于第二列选择/删除pandas多级索引行

3

从这个问题复制示例,考虑以下数据框:

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

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

         col
one two     
a   t      0
    u      1
    v      2
    w      3
b   t      4
    u      5
    v      6
    w      7
    t      8
c   u      9
    v     10
d   w     11
    t     12
    u     13
    v     14
    w     15

假设我想保留多重索引的第二层级中的两行。即我的最终数据框如下:
         col
one two     
a   t      0
    u      1
b   t      4
    u      5
c   u      9
    v     10
d   w     11
    t     12

如何最好地实现上述目标?理想情况下,我希望像这样做(显然是错误的语法)
df.iloc[(:, :2)]

即所有来自级别0的值,以及来自级别1的前两个值。
2个回答

3

使用groupby和head(2)方法

df.groupby('one').head(2)

Out[246]:
         col
one two
a   t    0
    u    1
b   t    4
    u    5
c   u    9
    v    10
d   w    11
    t    12

1
啊,我正准备用这个更新我的答案 :-). - Quang Hoang
@QuangHoang: 你的也很棒 :D - Andy L.
@AndyL. @QuangHoang 非常感谢你们的回答。在多级索引中,选择基于索引的输出是否存在更通用的答案?例如:假设我想要选择第二级中的 1、3、5、7... range(1, n, 2) 索引。 - skgbanga
@skgbanga:你想选择整个第二层的1, 3, 5, 7...还是每个第一层的值的第二层?即整个第二层将是u,w,u,w...,而每个第一层将是a:u,wb:u,wc:v... - Andy L.
1
@skgbanga: 关于位置索引,获取第一级每个值中第二级的位置3和获取无论索引级别如何的通用位置3之间存在差异。这就是为什么我想在回答之前澄清。如果您想要一种通用的方法来获取第二个索引,可以使用get_level_valuesqueryxsgroupby.nth或带有pd.IndexSlice和元组的loc... 这非常广泛。@CS95在这个主题上有一个很棒的帖子,链接在这里https://dev59.com/YVQJ5IYBdhLWcg3wZlGZ。我建议您阅读它以获取更多细节。 - Andy L.
显示剩余2条评论

2
这里有一种使用groupby的方法:
df[df.groupby('one').cumcount().le(1)]

输出:

         col
one two     
a   t      0
    u      1
b   t      4
    u      5
c   u      9
    v     10
d   w     11
    t     12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接