我有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]
来获取相关值?
答案 0 :(得分:3)
您需要remove_unused_levels
,new 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')