【问题标题】:how to calculate slop and do operations between multiindex dataframe?如何计算斜率并在多索引数据帧之间进行操作?
【发布时间】:2021-08-26 20:49:06
【问题描述】:

我有这个数据框

   Name  Op  A    B    C
   Ob1   L   1    2    3
         F   2    4    6 
   Ob2   L   4    5    6
         F   8    10  12 

其中 Name y Op 是索引和子索引,但我必须在多索引行之间进行一些操作,例如,将它们相乘:Mult=L*F 并在新的子索引中显示答案,我期待这样:

   Name  Op  A    B    C
   Ob1   L   1    2    3
         F   2    4    6 
        Mult 2    8    18
   Ob2   L   4    5    6
         F   8    10   12 
        Mult 32   50   72

但我真的不知道如何开始。

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

    一种选择是采用一些横截面xs 进行操作:

    mult_df = df.xs('L', 0, 'Op').mul(df.xs('F', 0, 'Op'))
    

    mult_df:

           A   B   C
    Name            
    Ob1    2   8  18
    Ob2   32  50  72
    

    创建一个对齐的MultiIndex:

    mult_df['Op'] = 'Mult'
    mult_df = mult_df.set_index('Op', append=True)
    

    mult_df:

                A   B   C
    Name Op              
    Ob1  Mult   2   8  18
    Ob2  Mult  32  50  72
    

    然后appendsort_index

    new_df = df.append(mult_df).sort_index()
    

    new_df:

                A   B   C
    Name Op              
    Ob1  F      2   4   6
         L      1   2   3
         Mult   2   8  18
    Ob2  F      8  10  12
         L      4   5   6
         Mult  32  50  72
    

    作为单行:

    new_df = df.append(
        df.xs('L', 0, 'Op')
            .mul(df.xs('F', 0, 'Op'))
            .assign(Op='Mult')
            .set_index('Op', append=True)
    ).sort_index()
    

    完整的工作示例:

    import pandas as pd
    
    df = pd.DataFrame({
        'Name': ['Ob1', 'Ob1', 'Ob2', 'Ob2'],
        'Op': ['L', 'F', 'L', 'F'],
        'A': [1, 2, 4, 8],
        'B': [2, 4, 5, 10],
        'C': [3, 6, 6, 12]
    }).set_index(['Name', 'Op'])
    
    new_df = df.append(
        df.xs('L', 0, 'Op')
            .mul(df.xs('F', 0, 'Op'))
            .assign(Op='Mult')
            .set_index('Op', append=True)
    ).sort_index()
    
    print(new_df)
    

    【讨论】:

      【解决方案2】:

      这是我的解决方案 - 有点晚了,但它也可能派上用场。

      >>> data = [{'Name': 'Ob1', 'Op': 'L', 'A': 1, 'B': 2, 'C': 3},
       {'Name': 'Ob1', 'Op': 'F', 'A': 2, 'B': 4, 'C': 6},
       {'Name': 'Ob2', 'Op': 'L', 'A': 4, 'B': 5, 'C': 6},
       {'Name': 'Ob2', 'Op': 'F', 'A': 8, 'B': 10, 'C': 12}]
      
      >>> df = pd.DataFrame.from_dict(data)
      >>> df_agg = df.groupby('Name').agg('prod').assign(Op='Mult').reset_index()
      >>> df.append(df_agg, ignore_index=True).groupby(['Name','Op']).first()
      
      
                      A   B   C
             Name Op          
              Ob1 F   2   4   6
                  L   1   2   3
                Mult  2   8   18
              Ob2 F   8   10  12
                  L   4   5   6
               Mult   32  50  72
      

      【讨论】:

        猜你喜欢
        • 2021-08-28
        • 2020-05-08
        • 2021-11-04
        • 1970-01-01
        • 2021-10-07
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        相关资源
        最近更新 更多