You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用多索引列表筛选Pandas DataFrame的指定数据?

解决Pandas按两组索引列表筛选数据的问题

当然有办法实现你的需求啦!根据你的DataFrame结构,我分几种常见情况给你详细说明:

情况1:index1和index2是行的多级索引(MultiIndex)

如果你的DataFrame的行是由index1和index2组成的多级索引,比如构造示例:

import pandas as pd

data = {'value': [0.22, 1.22, 0.55, 0.77]}
index = pd.MultiIndex.from_tuples(
    [('chicago', 'rome'), ('berlin', 'praha'), ('chicago', 'praha'), ('berlin', 'rome')],
    names=['index1', 'index2']
)
df = pd.DataFrame(data, index=index)

你可以用两种方式筛选:

  • 方法1:使用pd.IndexSlice(推荐,语法更清晰)
    这种方式可以直接针对多级索引的层级传入列表筛选:

    list_ofCities1 = ['chicago', 'berlin']
    list_ofCities2 = ['rome']
    
    filtered_df = df.loc[pd.IndexSlice[list_ofCities1, list_ofCities2], :]
    

    执行后会得到所有index1在指定列表且index2在对应列表的行。

  • 方法2:布尔索引
    通过检查每个索引层级是否在目标列表中来构造筛选条件:

    mask = (df.index.get_level_values('index1').isin(list_ofCities1)) & \
           (df.index.get_level_values('index2').isin(list_ofCities2))
    filtered_df = df[mask]
    

情况2:index1是行索引,index2是列索引

如果你的DataFrame是index1作为行标签、index2作为列标签的结构(就像你给出的表格示例那样),比如:

import pandas as pd

data = {
    'rome': [0.22, 0.77],
    'praha': [0.55, 1.22]
}
df = pd.DataFrame(data, index=['chicago', 'berlin'])
df.index.name = 'index1'
df.columns.name = 'index2'

那你直接用df.loc[list_ofCities1, list_ofCities2]就可以实现需求!比如:

list_ofCities1 = ['chicago']
list_ofCities2 = ['rome', 'praha']

filtered_df = df.loc[list_ofCities1, list_ofCities2]

这样就能得到chicago行下,rome和praha列的子DataFrame,完全符合你的预期。

情况3:index1和index2是普通列(不是索引)

如果index1和index2只是DataFrame里的普通列,那用布尔索引筛选行即可:

mask = (df['index1'].isin(list_ofCities1)) & (df['index2'].isin(list_ofCities2))
filtered_df = df[mask]

内容的提问来源于stack exchange,提问作者Fabio Magarelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:58:35