如何使用多索引列表筛选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
相关产品推荐
相关产品推荐

