Страницы

Поиск по вопросам

суббота, 15 февраля 2020 г.

Преобразовать строку Pandas в словарь

#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'}]

Комментариев нет:

Отправить комментарий