代码之家  ›  专栏  ›  技术社区  ›  TTY

pands多指标子集选择

  •  2
  • TTY  · 技术社区  · 9 月前
    import pandas as pd
    import numpy as np
    
    # Sample data
    index = pd.MultiIndex.from_tuples([
        ('A', 'a1', 'x'),
        ('A', 'a1', 'y'),
        ('A', 'a2', 'x'),
        ('A', 'a2', 'y'),
        ('B', 'b1', 'x'),
        ('B', 'b1', 'y'),
        ('B', 'b2', 'x'),
        ('B', 'b2', 'y')
    ], names=['level_1', 'level_2', 'level_3'])
    
    data = np.random.randn(len(index))
    df = pd.DataFrame(data, index=index, columns=['value'])
    

    例如,我有上面的数据帧,它有3个级别的多索引。

    现在,我的目标是从这个数据帧中选择一个子集,其中前两个级别的索引来自笛卡尔乘积(a,B)*(a1,a2,b1,b2)的子集,比如S=[(a,a1),(B,b2)]。我想保持多指数的第三级。

    我希望结果是这样的

    Original DataFrame:
                            value
    level_1 level_2 level_3       
    A       a1      x     0.123456
                    y     0.234567
            a2      x     0.345678
                    y     0.456789
    B       b1      x     0.567890
                    y     0.678901
            b2      x     0.789012
                    y     0.890123
    
    Subset DataFrame:
                            value
    level_1 level_2 level_3       
    A       a1      x     0.123456
                    y     0.234567
    B       b2      x     0.789012
                    y     0.890123
    
    3 回复  |  直到 9 月前
        1
  •  2
  •   jezrael    9 月前

    使用 DataFrame.droplevel 对于删除3个级别,因此可以按子集进行筛选 Index.isin 在里面 boolean indexing :

    S = [('A', 'a1'), ('B', 'b2')]
    
    out = df[df.droplevel(2).index.isin(S)]
    print (out)
                                value
    level_1 level_2 level_3          
    A       a1      x        0.545790
                    y       -1.298511
    B       b2      x        0.018436
                    y       -1.076408
    
        2
  •  0
  •   lei zhang    9 月前

    使用 df.index.isin 过滤索引

    sub_df = df.loc[df.index.isin([("A", "a1"), ("B", "b2")])]
    

    https://pandas.pydata.org/docs/reference/api/pandas.Index.isin.html

        3
  •  0
  •   mozway    9 月前

    你可以简单地(对)- join ,通过定义显式级别名称,将自动进行对齐:

    out = df.join(
        pd.DataFrame(
            index=pd.MultiIndex.from_tuples(S, names=['level_1', 'level_2'])
        ),
        how='right',
    )
    

    输出:

                                value
    level_1 level_2 level_3          
    A       a1      x        0.681043
                    y       -0.137632
    B       b2      x        0.644387
                    y        2.440724