#python #pandas #dataframe
Добрый день. У меня есть датафрейм пандаса с составным индексом. Мне нужно перебрать все строки и каждую превратить в словарь вида {название_колонки: значение}. Причем, чтобы туда попадали и индексные колонки, и простые. Всё утро читаю документацию, написал вот такое: for row in df.itertuples(): idx_dct = dict(zip(df.index.names, row[0])) val_dct = dict(zip(df.columns, row[1:])) res_dct = dict(idx_dct, **val_dct) print(res_dct) Результат, конечно, получен. Но код мне совершенно не нравится и есть такое ощущение, что я изобретаю велосипед. Может быть, в пандасе есть какие-то специальные методы для того, что я хочу? UPD: Исходные датафрейм получен как pivot_table от другого датафрейма и имеет вид: val idx1 idx2 1 1 1 2 8 3 3 2 Я хочу получить список словарей: {'idx2': 1, 'idx1': 1, 'val': 1} {'idx2': 2, 'idx1': 1, 'val': 8} {'idx2': 3, 'idx1': 3, 'val': 2} (На самом деле, индексных и обычных колонок будет в несколько раз больше и заранее их перечня нет, его нужно выцеплять из самого датафрейма)
Ответы
Ответ 1
UPDATE: с использованием DF приведенном в измененном вопросе: In [24]: df Out[24]: val idx1 idx2 1 1 1 2 8 3 3 2 In [25]: df.reset_index().to_dict('records') Out[25]: [{'idx1': 1, 'idx2': 1, 'val': 1}, {'idx1': 1, 'idx2': 2, 'val': 8}, {'idx1': 3, 'idx2': 3, 'val': 2}] Это делается очень просто (если я правильно понял вопрос): Пример DF: In [15]: df Out[15]: a b c d first second bar one 1.009758 -0.384033 1.668898 -1.302448 two -0.356388 0.341411 0.109125 -0.202563 baz one 0.495853 1.052266 -0.264984 -0.343306 two -1.571577 -0.646954 -0.187620 0.594999 foo one -1.228468 0.092976 0.030144 -2.099977 two 1.588960 1.000785 0.875712 2.584941 qux one 0.590220 -1.305587 1.270706 -0.351706 two -0.643912 -0.597870 -0.921415 1.034810 Решение - получаем список словарей: In [16]: df.reset_index().to_dict('records') Out[16]: [{'a': 1.0097583468728302, 'b': -0.3840332867221293, 'c': 1.6688984434963192, 'd': -1.3024483316392064, 'first': 'bar', 'second': 'one'}, {'a': -0.3563883540306324, 'b': 0.3414110282364142, 'c': 0.10912532819005455, 'd': -0.20256250429340558, 'first': 'bar', 'second': 'two'}, {'a': 0.4958529642501866, 'b': 1.0522662314224476, 'c': -0.26498405219799387, 'd': -0.3433064145597633, 'first': 'baz', 'second': 'one'}, {'a': -1.5715767690652416, 'b': -0.6469535251089127, 'c': -0.18762036338991817, 'd': 0.5949991666517178, 'first': 'baz', 'second': 'two'}, {'a': -1.2284678785281338, 'b': 0.09297646032741932, 'c': 0.030143674588866923, 'd': -2.0999765379840656, 'first': 'foo', 'second': 'one'}, {'a': 1.5889599693307292, 'b': 1.0007848283996947, 'c': 0.8757119900619003, 'd': 2.5849411147424046, 'first': 'foo', 'second': 'two'}, {'a': 0.5902198338135144, 'b': -1.305587223739773, 'c': 1.270706125958048, 'd': -0.3517064424514258, 'first': 'qux', 'second': 'one'}, {'a': -0.6439118906436252, 'b': -0.5978697429631142, 'c': -0.9214146623018005, 'd': 1.034810389524401, 'first': 'qux', 'second': 'two'}]
Комментариев нет:
Отправить комментарий