У меня есть итеративный процесс, который выполняется с разными значениями параметров на каждой итерации, и я хочу собрать значения параметров и результаты и поместить их в фрейм данных Pandas с мультииндексом, созданным из наборов значений параметров (которые являются уникальными) .
На каждой итерации значения параметров в словаре выглядят так:
params = {'p': 2, 'q': 7}
Так что их легко собрать в список вместе с результатами:
results_index = [
{'p': 2, 'q': 7},
{'p': 2, 'q': 5},
{'p': 1, 'q': 4},
{'p': 2, 'q': 4}
]
results_data = [
{'A': 0.18, 'B': 0.18},
{'A': 0.67, 'B': 0.21},
{'A': 0.96, 'B': 0.45},
{'A': 0.58, 'B': 0.66}
]
Но я не могу найти простой способ получения нужного мультииндекса из results_index
.
Я пробовал это:
df = pd.DataFrame(results_data, index=results_index)
Но он производит это:
A B
{'p': 2, 'q': 7} 0.18 0.18
{'p': 2, 'q': 5} 0.67 0.21
{'p': 1, 'q': 4} 0.96 0.45
{'p': 2, 'q': 4} 0.58 0.66
(индекс не преобразован в мультииндекс)
Я хочу вот что:
A B
p q
2 7 0.18 0.18
5 0.67 0.21
1 4 0.96 0.45
2 4 0.58 0.66
Это работает, но должен быть более простой способ:
df = pd.concat([pd.DataFrame(results_index), pd.DataFrame(results_data)], axis=1).set_index(['p', 'q'])
UPDATE:
Кроме того, это работает, но заставляет меня нервничать, потому что как я могу быть уверен, что значения параметров выровнены с именами уровней?
index = pd.MultiIndex.from_tuples([tuple(i.values()) for i in results_index],
names=results_index[0].keys())
df = pd.DataFrame(results_data, index=index)
A B
p q
2 7 0.18 0.18
5 0.67 0.21
1 4 0.96 0.45
2 4 0.58 0.66