我有一个带有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
不存在。
答案 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
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