如何将多级列名称仅添加到python pandas.DataFrame中的特定列(不是所有列)?

时间:2019-05-27 09:51:16

标签: python pandas dataframe multi-index multi-level

请参考here作为问题背景。我只想将C添加到列B中。

我需要输出为:

 df
    Out[92]: 
       A  B
          C
    a  0  0
    b  1  1
    c  2  2
    d  3  3
    e  4  4

我尝试将this example设置为:

dfnew=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})

columns=[('c','b')]  #changed from columns=[('c','a'),('c','b')]

dfnew.columns=pd.MultiIndex.from_tuples(columns)

但这不起作用。 ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements

1 个答案:

答案 0 :(得分:2)

您可以使用MultiIndex.from_arrays

df.columns = pd.MultiIndex.from_arrays([df.columns, ['','C']])

   A  B
      C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

请注意,顾名思义,pd.MultiIndex.from_tuples需要一个元组列表。如果检查源代码,您会发现如果不是这种情况,它将通过zipping从嵌套列表中创建一个:

list(zip(*[df.columns, ['','C']]))
# [('A', ''), ('B', 'C')]

这就是为什么您得不到期望的原因。


如果要通过指定列列表来执行相同的操作,则可以执行以下操作:

cols = [(i, 'C') if i in ['B','D'] else (i, '') for i in df.columns]
# [('A', ''), ('B', 'C'), ('C', ''), ('D', 'C')]
df.columns = pd.MultiIndex.from_tuples(cols)

   A  B  C  D
      C     C
a  0  0  0  0
b  1  1  1  1
c  2  2  2  2
d  3  3  3  3
e  4  4  4  4