提取 pandas 多索引数据框的子集

extract the subset of a pandas multi index data frame

>new_dat=dat_corr.merge(dat_class,on="Asset",how="right").set_index(['Country','‌​Class','Asset'])
>new_dat.shape
(89, 89) 
>temp1='UNITEDSTATES' 
>temp2='Equity'
>new_dat.loc[ (new_dat.index.get_level_values('Country').isin([temp1]) & new_dat.index.get_level_values('Class').isin([temp2]))]'
>new_dat.columns=new_dat.index

最后一行给出了 [3 行 x 89 列]。我的 89 列是 Equity/FX/FI/Commodities 的混合。如果我只想要美国股票与所有其他股票的对比,而不是 entre 89 列,我该怎么做? 我还为列添加了多索引。现在的问题是我在行和列上都有多个索引,我该如何使用它进行过滤 以下是数据的一小部分:

国家美国加拿大\ Class股权股权
资产 DJ1Index SP1Index ND1Index PT1Index
国家Class资产
美国股票 DJ1 指数 1.000000 0.958038 0.747192 0.648373
SP1 指数 0.958038 1.000000 0.825458 0.717545
ND1 指数 0.747192 0.825458 1.000000 0.612487
加拿大股票 PT1Index 0.648373 0.717545 0.612487 1.000000
墨西哥股票 IS1 指数 0.622570 0.664499 0.565702 0.575618

国家 MEXICO BRAZIL GERMANY BRITAIN \ Class股权股权股权股权股权股权
资产 IS1Index BZ1Index VG1Index Z1Index
国家Class资产
美国股票 DJ1 指数 0.622570 0.523704 0.566993 0.520526
SP1 指数 0.664499 0.565941 0.587933 0.539138
ND1 指数 0.565702 0.484441 0.458135 0.391391
加拿大股票 PT1Index 0.575618 0.526663 0.499343 0.493260
墨西哥股票 IS1 指数 1.000000 0.577041 0.502558 0.487487

您可以像这样在逗号后将您的列添加到 .loc 方法:

df.loc[(cond1) & (cond2), 'column_name']

这将输出您的 df 按您的条件过滤后只有一列 column_name

如果将它们放在列表中,则可以有多个列:

df.loc[(cond1) & (cond2), ['column_name1', 'column_name2']]

详情请见docs

编辑:

如果您的列也是 MultiIndex,您可以使用 IndexSlice

import pandas as pd
idx = pd.IndexSlice
df.loc[(cond1) & (cond2), idx[:,'column_name']]

请注意,idx[:,'column_name'] 应根据您的 MultiIndex 设置进行调整。 IE。 MultiIndex.

的每个级别都需要 :column_name(s)

您可能会在 MultiIndex docs 中找到有关如何使用它的有用示例。值得注意的是关于需要对 Index 词法排序的警告,并且 pandas 版本应该是 0.14.+.

如果你能提供一个可重现的数据框示例,那么给出更具体的答案会更容易。