Цель этого ответа - показать, что есть прямой способ сделать это с помощью простой итерации и инструментов из стандартной библиотеки.
Часто мы выполняем много преобразований в Pandas DataFrame, где каждое преобразование вызывает создание нового объекта Pandas. Иногда это может быть интуитивным прогрессом и иметь смысл. Однако бывают случаи, когда мы забываем, что можем использовать более простые инструменты. Я считаю, что это один из тех времен. В моем ответе все еще используются панды, потому что я использую метод itertuples
.
from collections import defaultdict
d = defaultdict(dict)
for a, b, c in df.itertuples(index=False):
d[b][a] = c
d = dict(d)
d
{'t': {'a1': 1, 'a2': 2}, 'd': {'a3': 3, 'a4': 4}}
Небольшая альтернатива. Поскольку кортежи, которые мы перебираем, называются кортежами, мы можем получить доступ к каждому элементу по имени столбца, который он представляет.
from collections import defaultdict
d = defaultdict(dict)
for t in df.itertuples():
d[t.ColB][t.ColA] = t.ColC
d = dict(d)
d
{'t': {'a1': 1, 'a2': 2}, 'd': {'a3': 3, 'a4': 4}}