Как преобразовать DataFrame в словарь?
Есть задача, решение которой привожу.
Исходная таблица.
test = pd.DataFrame({"par1": [1, 2, 3, 4, 5], "par2": [11, 12, 13, 14, 15],
"country": ["UA", "UA", "US", "US", "CHI"],
})
print(test)
par1 par2 country
0 1 11 UA
1 2 12 UA
2 3 13 US
3 4 14 US
4 5 15 CHI
Ее необходимо преобразовать в словарь списков вида:
{'CHI': [{'country': 'CHI', 'par1': 5, 'par2': 15}],
'UA': [{'country': 'UA', 'par1': 1, 'par2': 11},
{'country': 'UA', 'par1': 2, 'par2': 12}],
'US': [{'country': 'US', 'par1': 3, 'par2': 13},
{'country': 'US', 'par1': 4, 'par2': 14}]}
Я решил так:
def dictionarizer(g):
global param_dict
param_dict.update({g.country.values[0]: g.to_dict(orient="records")})
param_dict = dict()
test.groupby("country").apply(dictionarizer)
Но мне не нравится это решение. Глобальные переменные, побочные эффекты функции...
Подскажете более "стильное решение"?
Еще лучше было бы
{'CHI': [{ 'par1': 5, 'par2': 15}],
'UA': [{ 'par1': 1, 'par2': 11},
{ 'par1': 2, 'par2': 12}],
'US': [{ 'par1': 3, 'par2': 13},
{ 'par1': 4, 'par2': 14}]}
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
res = (test
.groupby("country")
.apply(lambda x: x.drop(columns="country").to_dict("records"))
.to_dict())
результат:
In [37]: res
Out[37]:
{'CHI': [{'par1': 5, 'par2': 15}],
'UA': [{'par1': 1, 'par2': 11}, {'par1': 2, 'par2': 12}],
'US': [{'par1': 3, 'par2': 13}, {'par1': 4, 'par2': 14}]}