Pandas 添加两个多索引列的较低级别
我有以下数据帧:Pandas 添加两个多索引列的较低级别,pandas,Pandas,我有以下数据帧: 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(va
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)
现在我想向这个数据帧添加另一列(n3
),其较低级别的列p
和m
应该是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
下面是我想到的代码:
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)
这正是我想要的,但与不使用多索引列的代码相比,感觉非常麻烦:
df['n3'] = df[['n1', 'n2']].sum(axis=1)
我当前的代码也只适用于由两个级别组成的列多索引,我对任意级别都感兴趣
有什么更好的方法吗?使用
堆栈和取消堆栈的一种方法:
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
如果您构建如下结构:
df['n3','p']=1
df['n3','m']=1
然后你可以写:
df['n3'] = df[['n1', 'n2']].sum(axis=1, level=1)
这是我刚刚发现的另一种方法,它不会对列进行重新排序:
# 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)
这是可行的,但是堆栈
/取消堆栈
组合框会对列重新排序。这是可行的,但会对列结构进行硬编码,因此它不能像其他列名那样使用。
# 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)