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