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

#python #pandas #dictionary

#python #pandas #словарь

Вопрос:

Я хочу объединить несколько словарей с одинаковыми ключами без удаления каких-либо пар ключ / значение и преобразовать в 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...
 

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

1. Ваш желаемый dict имеет несколько экземпляров одних и тех же ключей. Python не может этого сделать.

2. Как отметил @glibdud, для python требуются уникальные ключи. Зачем вам нужна коллекция пар ключ-значение, где ключи не являются уникальными (чего вы пытаетесь достичь)? В зависимости от того, что вы действительно пытаетесь сделать, collections.ChainMap это может быть полезно.

3. @benvc, я хотел сгруппировать их вместе, чтобы при переносе их в фрейм данных они отображались как целая строка.

4. Затем вам следует отредактировать свой вопрос и спросить, как вы могли бы объединить данные из нескольких dicts с одинаковыми ключами в одну строку в a DataFrame (для создания a требуется больше DataFrame , чем из одного dict). Обязательно включите пример ожидаемого результата от полученного результата DataFrame .

5. @benvc, я отредактировал его в лучшую форму. Большое спасибо ! Я все еще новичок в программировании и все еще учусь. Спасибо за ваше руководство!

Ответ №1:

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

 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
 

Вы могли бы создать простую функцию для преобразования произвольного количества dicts в одну строку 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)
 

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

1. Как сделать так, чтобы диктанты выполнялись полностью? Потому что у меня около 120 тыс. таких dicts, и некоторым нужно это делать, а другим нет. Я попробовал этот метод и внедрил его в цикл, и мне удалось запустить его только для одной строки (другие строки, такие как d3 и d4 и d5 для индекса [1], не будут отображаться.)

2. @WeiLunss — вы пытаетесь создать несколько строк в одном и том же DataFrame из разных групп dicts? Если да, будет ли в каждой строке одинаковое количество столбцов?

3. Да, но не все строки имеют одинаковое количество столбцов, так как эта работа на самом деле заключается в размещении дубликатов с разными «DB» сзади. Для тех, кто уникален, у них не будет никаких dicts для сопряжения с ними. Эти dicts, показанные здесь, на самом деле были вложенными dicts, которые я переношу из них из таблицы строка за строкой, строка сама по себе является dict.

4. Моя концепция состоит в том, чтобы сравнивать их один за другим, при обнаружении дубликатов в другом dict объединять их вместе в виде строки. Таким образом, может быть строка, в которой есть только один dict, и строки, в которых может быть до нескольких dicts, соединенных вместе.

5. @WeiLunss — это совсем немного отличается от текущего вопроса. Вероятно, вам лучше опубликовать отдельный вопрос (потому что активность по текущему вопросу просто запутает других читателей, учитывая, что ваша конечная цель сильно отличается от приведенного здесь примера). Я бы предложил опубликовать вопрос, в котором показан пример данных, с которых вы начинаете (и указывается, является ли это a DataFrame , list of dicts или что бы это ни было), а затем объяснить условия, которые будут определять, какие строки должны быть объединены, а какие должны оставаться неизменными.