如何从过滤后的DataFrame中仅获取相关索引值?

时间:2017-09-14 07:54:06

标签: python pandas

我有DataFrame这样:

t = [v for v in zip(['Tan'] * 5 + ['Rad'] * 5, ['min', 'max', 'var', 'rf', 'uf'] * 2)]
df = pd.DataFrame([1.,2,3,4,5]*2, index=pd.MultiIndex.from_tuples(t), columns=['val'])

那是

         val
Tan min  1.0
    max  2.0
    var  3.0
    rf   4.0
    uf   5.0
Rad min  1.0
    max  2.0
    var  3.0
    rf   4.0
    uf   5.0

当我使用df[df.val >= 3]获取

过滤此对象时
         val
Tan var  3.0
    rf   4.0
    uf   5.0
Rad var  3.0
    rf   4.0
    uf   5.0

但是,如果我想从索引级别1获取所有唯一值,如下所示:

df[df.val >= 3].index.levels[1].unique()

结果将是

['max', 'min', 'rf', 'uf', 'var']

而不仅仅是['rf', 'uf', 'var'],这是我期望看到的。

如何根据我DataFrame获得的过滤后的df[df.val >= 3]来获取相关值?

2 个答案:

答案 0 :(得分:3)

您需要remove_unused_levelsnew in version 0.20.0.

df1 = df[df.val >= 3]

print (df1.index)
MultiIndex(levels=[['Rad', 'Tan'], ['max', 'min', 'rf', 'uf', 'var']],
           labels=[[1, 1, 1, 0, 0, 0], [4, 2, 3, 4, 2, 3]])

df1.index = df1.index.remove_unused_levels()
print (df1.index)
MultiIndex(levels=[['Rad', 'Tan'], ['var', 'rf', 'uf']],
           labels=[[1, 1, 1, 0, 0, 0], [0, 1, 2, 0, 1, 2]])


print (df1.index.levels[1])
Index(['var', 'rf', 'uf'], dtype='object')

答案 1 :(得分:2)

您可以使用get_level_values

df[df.val >= 3].index.get_level_values(1).unique()
Index(['var', 'rf', 'uf'], dtype='object')