【问题标题】:extract the subset of a pandas multi index data frame提取熊猫多索引数据框的子集
【发布时间】:2015-01-27 08:30:36
【问题描述】:
>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 的组合。如果我只想要美国股票而不是所有其他股票而不是整个 89 列,我该怎么做? 我还为列添加了多索引。现在的问题是我沿行和列都有多个索引我如何使用它进行过滤 以下是一小部分数据:

国家 美国 加拿大 \ 类股权 股权
资产 DJ1Index SP1Index ND1Index PT1Index
国家级资产
美国股票 DJ1Index 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
墨西哥股票 IS1 指数 0.622570 0.664499 0.565702 0.575618

国家 墨西哥 巴西 德国 英国 \ 类别 股权 股权 股权 股权
资产 IS1Index BZ1Index VG1Index Z1Index
国家级资产
美国股票 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
墨西哥股票 IS1 指数 1.000000 0.577041 0.502558 0.487487

【问题讨论】:

    标签: python pandas multi-index


    【解决方案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 设置进行调整。 IE。 MultiIndex 的每个级别都需要 :column_name(s)。

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

    如果您要放置一个可重现的数据框示例,则更容易给出更具体的答案。

    【讨论】:

    • 感谢您的回复。然而,这并不能帮助我实现我想要的。我已经更新了问题。
    • 对不起,这个问题我不清楚。我在上面添加了更多信息。希望这会有所帮助。
    • >new_dat1=new_dat.loc[ (new_dat.index.get_level_values('Country').isin([temp1]) & new_dat.index.get_level_values('Class').isin([temp2] ))] >new_dat2=new_dat1.xs(temp3, level='Country', axis=1, drop_level=False) >final_dat=new_dat2.xs(temp4, level='Class', axis=1, drop_level=False) 这个用于过滤多索引(行和列)
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2014-06-21
    • 2013-12-04
    • 2017-03-12
    相关资源
    最近更新 更多