Как объединить данные из нескольких диктов в одну строку в DataFrame

1

Я хочу объединить несколько словарей с одинаковыми ключами, не удаляя пар ключ/значение, и преобразовать их в DataFrame.

Я пробовал dict.update(), но он заменяет прежние значения новыми для дубликатов ключей.

dict3[1]
{'DB': 'M',
 'TITLE': 'ACM Journal of Computer Documentation ',
 'ISSN': '1527-6805',
 'e-ISSN': '1557-9441',
 'ISBN': nan,
 'e-ISBN': nan}

dict4[0]
{'DB': 'D',
 'TITLE': 'ACM Computing Surveys ',
 'ISSN': '0360-0300',
 'e-ISSN': '1557-7341',
 'ISBN': nan,
 'e-ISBN': nan}

Я хотел бы, чтобы результат содержал все ключи в одной строке независимо от того, являются ли значения одинаковыми или разными, хотя они являются перекрывающимися ключами. Таблица должна выглядеть следующим образом:

   DB      TITLE         ISSN      e-ISSN  ...    DB     TITLE        ISSN ...
0   M   ACM Journal... 1527-6805  1557-9441  ...   D  ACM Comput... 0360-0300...
  • 0
    Ваш желаемый dict имеет несколько экземпляров одних и тех же ключей. Python не может этого сделать.
  • 0
    Как отмечает @glibdud, для python-диктов требуются уникальные ключи. Зачем вам нужен набор пар «ключ-значение», где ключи не уникальны (чего вы пытаетесь достичь)? В зависимости от того, что вы на самом деле пытаетесь сделать, вам может пригодиться collections.ChainMap .
Показать ещё 3 комментария
Теги:
pandas
dictionary

1 ответ

0

Вы можете объединить ключи каждого dict для представления столбцов строк, а затем объединить значения каждого dict в одну строку (передаваемую в конструктор DataFrame как вложенный диктат для создания строки, а не одного столбца). Например:

import pandas as pd

nan = float('nan')
d1 = {'DB': 'M', 'TITLE': 'ACM Journal of Computer Documentation', 'ISSN': '1527-6805', 'e-ISSN': '1557-9441', 'ISBN': nan, 'e-ISBN': nan}
d2 = {'DB': 'D', 'TITLE': 'ACM Computing Surveys', 'ISSN': '0360-0300', 'e-ISSN': '1557-7341', 'ISBN': nan, 'e-ISBN': nan}

columns = [*d1.keys(), *d2.keys()]
row = [*d1.values(), *d2.values()]
df = pd.DataFrame([row], columns=columns)
print(df)
#   DB                                  TITLE  ...  DB                  TITLE
# 0  M  ACM Journal of Computer Documentation  ...   D  ACM Computing Surveys

Вы можете создать простую функцию для преобразования произвольного числа диктовок в один ряд DataFrame используя тот же базовый подход. Например:

def dicts_to_single_row_df(*args):
    columns = [k for d in args for k in d.keys()]
    row = [v for d in args for v in d.values()]
    return pd.DataFrame([row], columns=columns)

df = dicts_to_single_row_df(d1, d2)
  • 0
    Как заставить диктовку работать вообще? Потому что у меня около 120 тыс. Таких диктов, и некоторым нужно это делать, а другим нет. Я попробовал этот метод и внедрил его в цикл, и мне удалось заставить его работать все еще только для строки (другие строки, такие как d3 и d4 и d5 для индекса [1], не выйдут.)
  • 0
    @WeiLunss - вы пытаетесь создать несколько строк в одном и том же DataFrame из разных групп диктов? Если да, будет ли в каждой строке одинаковое количество столбцов?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню