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

时间:2015-01-27 08:30:36

标签: python pandas multi-index

>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的混合体。如果我只想要美国股票和所有其他股票而不是enitre 89列,我该怎么做? 我还为列添加了多索引。现在的问题是我在行和列上都有多个索引如何使用它进行过滤 以下是数据的一小部分:

国家/地区加拿大美国 类别股权权益
资产DJ1Index SP1Index ND1Index PT1Index
国家一级资产
UNITEDSTATES股票DJ1指数1.000000 0.958038 0.747192 0.648373
                    SP1Index 0.958038 1.000000 0.825458 0.717545
                    ND1Index 0.747192 0.825458 1.000000 0.612487
加拿大股票PT1指数0.648373 0.717545 0.612487 1.000000
墨西哥股票IS1指数0.622570 0.664499 0.565702 0.575618

国家墨西哥巴西德国英国 类别股权权益股权权益
资产IS1Index BZ1Index VG1Index Z1Index
国家一级资产
UNITEDSTATES股票DJ1指数0.622570 0.523704 0.566993 0.520526
                    SP1Index 0.664499 0.565941 0.587933 0.539138
                    ND1Index 0.565702 0.484441 0.458135 0.391391
加拿大股票PT1Index 0.575618 0.526663 0.499343 0.493260
MEXICO Equity IS1Index 1.000000 0.577041 0.502558 0.487487

1 个答案:

答案 0 :(得分:1)

您可以在逗号之后将列添加到.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设置。即您需要为:的每个级别设置column_nameMultiIndex(s)。

您可以在MultiIndex docs中找到有关如何使用此功能的有用示例。值得注意的是需要让你的Index lexsorted和你的熊猫版本的警告应该是0.14。+。

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