![](/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.