Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 添加两个多索引列的较低级别_Pandas - Fatal编程技术网

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)