![](/img/trans.png)
[英]Pandas filter MultiIndex on part of MultiIndex using .loc
[英]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.