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,并選擇在內部連接操作期間將保留的每個索引的部分。
添加回答
舉報