首页 > 解决方案 > 在 MultiIndex 中选择水平对的子集元组

问题描述

(抱歉,如果这是转发。我能找到的最接近的答案是:multiindex selection in pandas并不能完全满足我的要求。相反,我将使用该问题中的数据作为示例,因为我自己的数据有类似的设置,但需要更多解释)

这是数据(重新发布):

                    0  1  2  3
first second third            
C     one    mean   3  4  2  7
             std    4  1  7  7
      two    mean   3  1  4  7
             std    5  6  7  0
      three  mean   7  0  2  5
             std    7  3  7  1
H     one    mean   2  4  3  3
             std    5  5  3  5
      two    mean   5  7  0  6
             std    0  1  0  2
      three  mean   5  2  5  1
             std    9  0  4  6
V     one    mean   3  7  3  9
             std    8  7  9  3
      two    mean   1  9  9  0
             std    1  1  5  1
      three  mean   3  1  0  6
             std    6  2  7  4

根据先前的查询,我有一组基于第 0 列中小于等于 3 的值的第一和第二索引级别的元组。例如:

# 选择第 0 列的“平均”值 <= 3 的行。
ser = df.loc[(slice(None), slice(None), 'mean'), 0]
ser = ser[ser <= 3]

idx_tuples = [(val[0], val[1]) for val in ser.index]
# 有值:[(C, 一), (C, 二), (H, 一), (V, 一), (V, 二), (V, 三)]

现在,我想从原始帧 ( df) 中选择均值行和标准行,以获得满足上述元组集的索引值。我可以单独遍历每个元组,然后进行连接操作,但我想知道是否有更多 Pythonic / Pandas-ic(?) 方法来实现我想要的智能切片等(特别是因为元组的数量我的数据集数量以千计)?

谢谢!

PS:请注意,我的问题在于前 2 个级别的特定元组满足选择条件,所以我不能对get_level_values.

标签: pythonpandasmulti-index

解决方案


您可以使用unstackand laterstack将删除 nan 并使用wherebetween 将您不想要的行替换为 nan 的事实。

df_ = (df.unstack('third')
         .where(lambda x: x[(0,'mean')].le(3))
         .stack('third')
      )
print (df_) #for me as I don't have the same random values
                      0    1    2    3
first second third                    
C     two    mean   1.0  3.0  7.0  8.0
             std    9.0  0.0  0.0  9.0
H     one    mean   3.0  0.0  2.0  1.0
             std    7.0  9.0  2.0  7.0
      two    mean   0.0  2.0  1.0  0.0
             std    6.0  5.0  6.0  5.0

推荐阅读