3 回答

TA貢獻1155條經驗 獲得超0個贊
過濾器函數的正則表達式部分的實現很短,很容易適應多索引場景,在這種情況下您仍然希望只使用多索引的正則表達式 1 部分。我知道這不是對您所問內容的直接回答,因為您是對的,因為實現的過濾器功能不處理多索引。
我在這里遇到了同樣的問題,并認為發布我使用過的代碼(改編自 pandas 原始代碼)可能對其他人來說是一個有用的答案:
import regex as re
def filter_multi(df, index_level_name, regex, axis=0):
def f(x):
return matcher.search(str(x)) is not None
matcher = re.compile(regex)
values = df.axes[axis].get_level_values(index_level_name).map(f)
return df.loc(axis=axis)[values]
使用附錄中的代碼:
print(df)
print(filter_multi(df, index_level_name='tag', regex='^Assets$', axis=0))
print(filter_multi(df, index_level_name='fy', regex='^2019$', axis=1))

TA貢獻1808條經驗 獲得超4個贊
另一種選擇是首先uom
從您的索引中刪除,應用filter
(然后將其應用于唯一的索引tag
)并添加uom
回您的索引,如
df.reset_index('uom').filter(regex="^Assets$", axis=0).set_index('uom', append=True)

TA貢獻1802條經驗 獲得超10個贊
如果你想從多索引的第一部分過濾一個唯一值,你可以使用loc
:
df.loc[['Assets']]
這使:
fy 2018 2019 tag uom Assets USD 3.753190e+11 3.385160e+11
如果對于你的實際問題,必須使用過濾器,你應該重置索引未使用的部分并在過濾后將其設置回去:
df.reset_index(level='uom').filter(regex='^Assets$', axis=0).set_index('uom', append=True)
添加回答
舉報