根据其他列的值在多索引数据框中创建新列的简单方法

Posted

技术标签:

【中文标题】根据其他列的值在多索引数据框中创建新列的简单方法【英文标题】:easy way to create new columns in multiindex dataframe based on values of other columns 【发布时间】:2017-08-06 01:42:04 【问题描述】:

我有多索引数据框:

df=pd.DataFrame(np.zeros((2,4)))
df.columns=pd.MultiIndex.from_arrays([['a','a','b','b'],[1,2,1,2]])
df['a']=10
df['b']=20

   a       b   
   1  2    1  2
0  10  10  20  20
1  10  10  20  20

我想创建一个新的上层列,它是“a”和“b”之和,即

想要的结果:

   a       b      c   
   1  2    1  2   1  2  
0  10  10  20  20 30 30
1  10  10  20  20 30 30

理想情况下,我想写一些类似于

的东西
df['c']=df['a']+df['b'] 

但它不适用于多索引数据帧

【问题讨论】:

【参考方案1】:

最简单的就是使用stackunstack

df = df.stack()
df['c']=df['a']+df['b'] 
df = df.unstack()
print (df)
    a       b       c    
    1   2   1   2   1   2
0  10  10  20  20  30  30
1  10  10  20  20  30  30

addconcat 的另一种解决方案:

df1 = df.a.add(df.b)
#create MultiIndex with c level
df1.columns = [['c'] * len(df1.columns), df1.columns]
print (df1)
    c    
    1   2
0  30  30
1  30  30

df2 = pd.concat([df, df1], axis=1)
print (df2)
    a       b       c    
    1   2   1   2   1   2
0  10  10  20  20  30  30
1  10  10  20  20  30  30

【讨论】:

第一个解决方案真的很简单。 是的,可能会慢一点,因为重塑。 ;) @jezrael:恭喜你进入精英 100K 俱乐部 ;-)【参考方案2】:

在添加列值时,我假设您的意思是“b”而不是“c”。 检查this 可能有帮助的问题。

【讨论】:

以上是关于根据其他列的值在多索引数据框中创建新列的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

如何应用于具有多索引列的数据框中的一组列

为多索引 Panda 数据框创建基于另一列的新列

根据其他两列的值在 Pandas 中创建一个新列[重复]

从不同数据框中设置新的多索引列的方法

按重复顺序为每个多索引设置列的值

多索引数据框到带有新列的数据透视表