2 回答
TA贡献1883条经验 获得超3个赞
df.loc[set3]工作,因为具有索引的所有3个级别。您可以模拟此行为,并将缺少的级别替换为 :set3set1set2slicer(None)
def select(df, index):
slicer = []
for name in df.index.names:
if name in index.names:
values = index.get_level_values(name).values
else:
values = slice(None)
slicer.append(values)
return df.loc[tuple(slicer), :]
然后,您可以使用:
select(df, set1)
select(df, set2)
select(df, set3)
如果您希望它作为数据帧上的方法:
pd.DataFrame.select = select
df.select(set1) # etc.
请注意,这将忽略 在 中不存在的级别:indexdf.index
# there's no level "FooBar" in df
set4 = pd.MultiIndex.from_tuples([(0, 42)], names=['Trigger', 'FooBar'])
df.select(set4) # works just fine
我还没有测试性能,如果你在一个紧密的循环中这样做,可能不会太快。
TA贡献1895条经验 获得超7个赞
使用纯熊猫实现此目的的一种方法是:
df.align(setN.to_series(), axis=0, join='inner')[0]
也就是说,将“其他”索引转换为 Series,并选择在内部连接操作期间将保留的每个索引的部分。
添加回答
举报
