我有以下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
),其较低级别的列p
和m
应该是{{ 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列,我想对任意级别执行此操作。
什么是更好的方法?
答案 0 :(得分:1)
使用stack
和unstack
的一种方法:
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)