亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python pandas 過濾器函數正則表達式在 MultiIndex 數據幀上的行為

python pandas 過濾器函數正則表達式在 MultiIndex 數據幀上的行為

呼如林 2023-02-15 17:15:50
tag這是一個帶有索引和 的MultiIndex 數據透視表uom。tag我的目標是使用正則表達式和過濾函數按索引過濾行。例如:df.filter(regex="^Assets$", axis="index")理想情況下會過濾掉該行:fy                                                              2018          2019                                      tag                                                uom                                                                  Assets                                             USD  3.753190e+11  3.385160e+11  但是,當我這樣做時,它會輸出一個空數據框:Empty DataFrame                                                                                                         Columns: [2018, 2019]                                                                                                   Index: []我能夠通過使用來規避這個問題:df.index.get_level_values("tag").str.contains("^Assets$")或者作為一個函數search = lambda df, regex, index_name: df.loc[df.index.get_level_values(index_name).str.contains(regex)]但這對我來說不太令人滿意。我是否遺漏了有關 pandas 過濾器功能及其正則表達式輸入如何工作的信息?它沒有按預期運行,我的猜測是因為我有 2 個索引:tag因此當我用作我的正則表達式時uom,正則表達式在索引中失敗。uom"^Assets$""^Assets$|USD"這是通過使用返回整個數據幀的正則表達式來支持的,因為所有行都有uom=USD,并且它表明過濾器函數將兩個索引都考慮在內。如果是這種情況,那么我如何有選擇地tag為 MultiIndex 數據幀上的過濾器函數選擇 index= ?
查看完整描述

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))


查看完整回答
反對 回復 2023-02-15
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

另一種選擇是首先uom從您的索引中刪除,應用filter(然后將其應用于唯一的索引tag)并添加uom回您的索引,如

df.reset_index('uom').filter(regex="^Assets$", axis=0).set_index('uom', append=True)


查看完整回答
反對 回復 2023-02-15
?
守候你守候我

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)


查看完整回答
反對 回復 2023-02-15
  • 3 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號