获取DataFrame多层索引列get_level_values()唯一值的多种方法
获取多层列索引的唯一层级值(替代set方法)
问题场景
现有如下多层列索引的DataFrame:
import pandas as pd df = pd.DataFrame( data=[ [0.7804, 0.5294, 0.1895, 0.9195, 0.0508], [0.1703, 0.7095, 0.8704, 0.8566, 0.5513], [0.8147, 0.9055, 0.0506, 0.4212, 0.2464], [0.3985, 0.4515, 0.7118, 0.6146, 0.2682], [0.2505, 0.2752, 0.4097, 0.3347, 0.1296] ], index=pd.Index([0.0, 0.1, 0.2, 0.3, 0.4], name='Time'), columns=pd.MultiIndex.from_tuples( [('A', 'a1'), ('A', 'a2'), ('B', 'b1'), ('B', 'b2'), ('B', 'b3')], names=['kind', 'names'] ) )
执行levs = df.columns.get_level_values("kind")后,得到包含重复值的索引:
Index(['A', 'A', 'B', 'B', 'B'], dtype='object', name='kind')
期望得到去重后的结果:
Index(['A', 'B'], dtype='object', name='kind')
已知通过levs = list(set(levs))可以实现,以下是几种更简便的替代方法:
方法1:调用Index的unique()方法
直接对get_level_values返回的索引对象调用unique(),结果仍为Index类型且保留原层级名称:
levs = df.columns.get_level_values("kind").unique() # 输出:Index(['A', 'B'], dtype='object', name='kind')
方法2:直接取MultiIndex的levels属性
MultiIndex的levels属性本身存储各层级去重后的唯一值集合,只需定位目标层级的位置:
# 通过层级名称获取位置 level_idx = df.columns.names.index('kind') levs = df.columns.levels[level_idx] # 输出:Index(['A', 'B'], dtype='object')
该方法无需遍历重复值,执行效率更高。
方法3:转为分类索引后取categories
若后续需使用分类数据,可先将层级索引转为CategoricalIndex,再提取categories:
levs = df.columns.get_level_values("kind").astype('category').categories # 输出:Index(['A', 'B'], dtype='object')
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

