Используйте кортеж, а не список:
>>> pandas.DataFrame(columns=('code', 'name', ('aa', 'ab')))
Empty DataFrame
Columns: [code, name, (aa, ab)]
Index: []
словарь ключи должны быть «hashable», что означает, что при том же значение ключа, вы всегда получите тот же ответ (https://docs.python.org/2/glossary.html), даже если значения хранятся в разных ячейках памяти.
Рассмотрим следующий пример:
>>> hash(('a','b')), hash(('a','b'))
(-3816799034373630758, -3816799034373630758)
>>> id(('a','b')), id(('a','b'))
(4329654248, 4369596640)
Две детали имеют различные идентификаторы (то есть, они хранятся в разных местах в памяти), но они имеют то же самое значение хеш-функции; с хешем кортежа реализуется с использованием хэшей битов, составляющих кортеж.
В списках не указан метод __hash__
. Даже если бы они это сделали, значение хэша не было бы одинаковым на протяжении всего жизненного цикла объекта. Это потому, что список изменен; добавление нового элемента в список изменит его хеш-значение.