繁体   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