Python 熊猫。复制多索引级别

Python 熊猫。复制多索引级别,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有一个具有多索引列的数据帧: df = pd.DataFrame(np.arange(12).reshape(3,-1)) df.columns = [['A', 'A', 'B', 'B'], [0, 1, 0, 1]] print(df) 看起来是这样的: A B 0 1 0 1 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 我想做一些类似于df['C']=df['B']的事情来获得: A

我有一个具有多索引列的数据帧:

df = pd.DataFrame(np.arange(12).reshape(3,-1))
df.columns = [['A', 'A', 'B', 'B'], [0, 1, 0, 1]]
print(df)
看起来是这样的:

   A      B    
   0  1   0   1
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
我想做一些类似于
df['C']=df['B']
的事情来获得:

    A       B       C    
    0   1   0   1   0   1
0   0   1   2   3   2   3
1   6   7   8   9   8   9
2  12  13  14  15  14  15
我得到
值错误:传递的项目数错误2,位置意味着1

我还尝试了
df.loc[:,slice('C',None)]=df['B']
,但没有成功


实际上,我的情况有点复杂:我在多索引中还有一个级别(
l0i
),我想将
df['l0i',B']
复制到
df['l0ii',B']
l0ii
不存在)。

您可以在列中提取列并创建
multi-index

df1 = df['B']
df1.columns = [['C'] * len(df1.columns), df1.columns]
print (df1)
    C    
    0   1
0   2   3
1   6   7
2  10  11
或按切片选择并重命名第一级:

df1 = df.loc[:, slice('B', None)].rename(columns={'B':'C'}, level=0)
print (df1)
    C    
    0   1
0   2   3
1   6   7
2  10  11
然后或一起:

df = df.join(df1)
#alternative
#df = pd.concat([df,df1], axis=1)
print (df)
   A      B       C    
   0  1   0   1   0   1
0  0  1   2   3   2   3
1  4  5   6   7   6   7
2  8  9  10  11  10  11
这里的另一个解决方案是使用,使用复制列,并通过以下方式重新塑形:


您可以使用
df['B']
在保留
多索引的同时提取列

因此,使用此和
concat
的一个非常简单的解决方案是:

df = pd.concat([df, df[['B']].rename(columns={'B': 'C'})], axis=1)
print(df)
   A      B       C    
   0  1   0   1   0   1
0  0  1   2   3   2   3
1  4  5   6   7   6   7
2  8  9  10  11  10  11

不知怎么的,我没有想到康卡特。简单。谢谢)@avloss-添加了另一个解决方案,我希望对您有帮助。
df = pd.concat([df, df[['B']].rename(columns={'B': 'C'})], axis=1)
print(df)
   A      B       C    
   0  1   0   1   0   1
0  0  1   2   3   2   3
1  4  5   6   7   6   7
2  8  9  10  11  10  11