>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 个专栏是股票/外汇/金融/商品的组合。如果我只想要美国股票与所有其他股票的比较,而不想要整个 89 列,我该怎么做? 我还为列添加了多重索引。现在的问题是,我在行和列上都有多个索引,如何使用它进行过滤 以下是一小部分数据:
国家/地区 美国 加拿大\
类别 股权 股权
Assets DJ1指数 SP1指数 ND1指数 PT1指数
国家级 Assets
美国股票 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
加拿大股票 PT1指数 0.648373 0.717545 0.612487 1.000000
墨西哥股票 IS1Index 0.622570 0.664499 0.565702 0.575618
国家/地区 墨西哥 巴西 德国 英国\
类别 股权 股权 股权 股权
Assets IS1Index BZ1Index VG1Index Z1Index
国家级 Assets
美国股票 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
加拿大股票 PT1指数 0.575618 0.526663 0.499343 0.493260
墨西哥股票 IS1Index 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']
应根据您的多索引设置进行调整。 IE。 MultiIndex
的每个级别都需要有 :
或 column_name
。
您可能会在 MultiIndex
docs 中找到有关如何使用此功能的有用示例。 。值得注意的是,需要对 Index
进行 lexsorted 的警告,并且 pandas 版本应为 0.14.+。
如果您提供数据框的可重现示例,则可以更轻松地给出更具体的答案。
关于python - 提取 pandas 多索引数据帧的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28166104/