添加两个Pandas MultiIndex列的较低级别

时间:2019-07-02 14:20:25

标签: pandas

我有以下DataFrame:

import pandas as pd

columns = pd.MultiIndex.from_arrays([['n1', 'n1', 'n2', 'n2'],
                                     ['p',  'm',  'p',  'm']])
values = [
    [1, 2,  3,  4],
    [5, 6,  7,  8],
    [9, 10, 11, 12],
]
df = pd.DataFrame(values, columns=columns)
  n1      n2    
   p   m   p   m
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

现在我想向此DataFrame添加另一列(n3),其较低级别的列pm应该是{{ 1}}和n1

n2

这是我想出的代码:

  n1      n2      n3    
   p   m   p   m   p   m
0  1   2   3   4   4   6
1  5   6   7   8  12  14
2  9  10  11  12  20  22

这可以满足我的要求,但是与不使用MultiIndex列的代码相比,它非常麻烦:

n3 = df[['n1', 'n2']].sum(axis=1, level=1)
level1 = df.columns.levels[1]
n3.columns = pd.MultiIndex.from_arrays([['n3'] * len(level1), level1])
df = pd.concat([df, n3], axis=1)

我当前的代码也仅适用于由两个级别组成的MultiIndex列,我想对任意级别执行此操作。

什么是更好的方法?

3 个答案:

答案 0 :(得分:1)

使用stackunstack的一种方法:

new_df = df.stack(level=1)
new_df['n3'] = new_df.sum(axis=1)
new_df.unstack(level=-1)

输出:

   n1     n2      n3    
    m  p   m   p   m   p
0   2  1   4   3   6   4
1   6  5   8   7  14  12
2  10  9  12  11  22  20

答案 1 :(得分:0)

如果您构建如下结构:

df['n3','p']=1  
df['n3','m']=1

然后您可以编写:

df['n3'] = df[['n1', 'n2']].sum(axis=1, level=1)

答案 2 :(得分:0)

这是我刚刚发现的另一种方法,它不会对列进行重新排序:

# Sum column-wise on level 1
s = df.loc[:, ['n1', 'n2']].sum(axis=1, level=1)

# Prepend a column level
s = pd.concat([s], keys=['n3'], axis=1)

# Add column to DataFrame
df = pd.concat([df, s], axis=1)