熊猫复制multiIndex级别

时间:2018-12-02 09:54:41

标签: python pandas dataframe multi-index

我有一个带有multiIndexed列的DataFrame:

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

我得到了ValueError: Wrong number of items passed 2, placement implies 1

我也尝试过df.loc[:, slice('C', None)] = df['B'],但没有运气。

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

2 个答案:

答案 0 :(得分:3)

您可以提取列并在列中创建MultiIndex

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

或通过切片和rename第一级进行选择:

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

然后一起joinconcat

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

答案 1 :(得分:0)

您可以在使用MultiIndex保留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