如何判断一个Pandas(Multi)索引是否为另一个的子集(顺序无关)
判断Pandas(多层)索引是否为另一个索引的子集(顺序无关)
刚好碰到过一模一样的需求——要判断Pandas的索引(不管是单层还是多层的)是不是另一个索引的子集,而且完全不用管顺序,只看值有没有全部存在就行。给你整理了一套可行的方案,结合示例一看就懂:
先写个通用判断函数
我们可以利用Python集合的无序特性来实现,不管是普通索引还是多层索引都能兼容:
import pandas as pd import numpy as np def issubset(idx_to_check, target_idx): # 处理单层索引:直接转集合 if idx_to_check.nlevels == 1: check_set = set(idx_to_check) target_set = set(target_idx) # 处理多层索引:先把每个索引组合转成元组,再转集合 else: check_set = set(idx_to_check.to_flat_index()) target_set = set(target_idx.to_flat_index()) # 利用集合的issubset方法判断 return check_set.issubset(target_set)
用你的测试数据验证
拿你给出的示例DataFrame来测试,结果完全符合预期:
# 创建测试用的DataFrame df0 = pd.DataFrame(np.random.rand(3,10), index=['foo', 'bar', 'baz']) df1 = pd.DataFrame(np.random.rand(2,10), index=['baz', 'foo']) df2 = pd.DataFrame(np.random.rand(3,10), index=['foo', 'baz', 'BLAH']) # 执行判断 print(issubset(df1.index, df0.index)) # 输出True:df1的所有索引值都在df0里 print(issubset(df0.index, df2.index)) # 输出False:df0里的'bar'不在df2的索引中
为啥这么实现?
- 对于单层索引,集合的无序性刚好匹配我们顺序无关的要求,而且Python原生的集合操作效率很高。
- 对于多层索引(MultiIndex),
to_flat_index()会把每一组多层索引转成一个元组,这样就能用集合来判断整个组合是否存在,不会出现层级不匹配的问题。
补充个替代方案
如果你不想自己写函数,也可以用Pandas自带的方法实现,不过性能上集合的方式会更优:
# 单层索引的情况 (df1.index.isin(df0.index)).all() # 多层索引的情况 (idx_to_check.to_flat_index().isin(target_idx.to_flat_index())).all()
内容的提问来源于stack exchange,提问作者ajwood
相关产品推荐
相关产品推荐

