Как добавить многоуровневое имя столбца только для определенного столбца (не для всех столбцов) в python pandas.DataFrame? - PullRequest
1 голос
/ 27 мая 2019

См. здесь для фона вопроса. Я хочу добавить C только к столбцу B.

Мне нужен вывод как:

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

Я пытался этот пример как:

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 Ответ

2 голосов
/ 27 мая 2019

Вы можете использовать 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 it:

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
...