簡體   English   中英

使用查詢字符串過濾 MultiIndex

[英]Filter MultiIndex with Query Strings

我有一個相當大的 DataFrame,比如說 600 個索引,並且想要使用過濾條件來生成一個簡化版本的 DataFrame,其中條件為真。 根據我所做的研究,當您將表達式應用於數據並且已經知道您正在操作的索引時,過濾效果很好。 但是,我想要做的是將過濾條件應用於索引。 請參閱下面的示例。

MultiIndex 為粗體,MultiIndex 名稱為斜體。

在此處輸入圖片說明

我想沿着這些方向應用如下(或其他)標准:

df = df[MultiIndex.query('base == 115 & Al.isin(stn)')]

然后也許做這樣的事情:

df = df.transpose()[MultiIndex.query('Fault.isin(cont)')].transpose

以導致:

在此處輸入圖片說明

我認為從根本上講,我正在嘗試生成一個布爾列表來掩蓋 MultiIndex。 如果有一種快速的方法可以將 Pandas 查詢應用於 2d 列表? 那是可以接受的。 到目前為止,似乎一個選項是采用 MultiIndex,將其轉換為 DataFrame,然后我可以應用過濾,因為我想獲取 TF 數組。 我擔心這會很慢。

正如您所注意到的,索引不適用於使用過濾器表達式進行查詢。 df.filter()但它在 MultiIndex 上似乎不太好用。

您仍然可以將 MultiIndex 值過濾為 Python 元組的可迭代對象,然后使用.loc訪問過濾后的結果。

這有效:

rows = [(season, cont)
        for (season, cont) in df.index
        if 'Fault' in cont]
cols = [(stn, base)
        for (stn, base) in df.columns
        if base == 115 and 'Al' in stn]
df.loc[rows, cols]

如果您所追求的是使用df.query()漂亮的語法來切片數據,那么您最好“取消透視”您的 DataFrame,將所有索引和列標簽轉換為常規字段。

您可以使用以下命令創建“unpivot”DataFrame:

df_unpivot = df.stack(level=[0, 1]).rename('value').reset_index()

這將產生一個如下所示的 DataFrame:

  season cont  stn   base value
0 Summer Fault Alpha  115   1.0
1 Summer Fault Beta   115   0.8
2 Summer Fault Gamma  230   0.7
3 Summer Trip  Alpha  115   1.2
4 Summer Trip  Beta   115   0.9
...

然后您可以查詢:

df_unpivot.query(
    'cont.str.contains("Fault") and '
    'stn.str.contains("Al") and '
    'base == 115'
)

其中產生:

  season cont  stn   base value
0 Summer Fault Alpha  115   1.0
6 Winter Fault Alpha  115   0.7

這是您期望的兩個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM