12

Преобразование списка словарей в DataFrame pandas

39

Как я могу преобразовать список словарей в DataFrame?

Мне нужно преобразовать следующий список:

[{'points': 50, 'time': '5:00', 'year': 2010}, 
 {'points': 25, 'time': '6:00', 'month': "february"}, 
 {'points': 90, 'time': '9:00', 'month': 'january'}, 
 {'points_h1': 20, 'month': 'june'}]

в следующий DataFrame:

      month  points  points_h1  time  year
0       NaN      50        NaN  5:00  2010
1  february      25        NaN  6:00   NaN
2   january      90        NaN  9:00   NaN
3      june     NaN         20   NaN   NaN

Как добиться такого результата?

5 ответ(ов)

16

Если ds — это список словарей (dict), то для создания DataFrame в Pandas вы можете использовать следующий код:

df = pd.DataFrame(ds)

Однако обратите внимание, что этот подход не сработает, если ваши словари имеют вложенные структуры. В случае вложенных данных вам необходимо сначала распаковать их, чтобы получить плоский формат.

1

В версии pandas 16.2 мне пришлось использовать pd.DataFrame.from_records(d), чтобы это заработало.

0

Вы также можете использовать pd.DataFrame.from_dict(d) следующим образом:

In [8]: d = [{'points': 50, 'time': '5:00', 'year': 2010}, 
   ...: {'points': 25, 'time': '6:00', 'month': "february"}, 
   ...: {'points':90, 'time': '9:00', 'month': 'january'}, 
   ...: {'points_h1':20, 'month': 'june'}]

In [12]: pd.DataFrame.from_dict(d)
Out[12: 
      month  points  points_h1  time    year
0       NaN    50.0        NaN  5:00  2010.0
1  february    25.0        NaN  6:00     NaN
2   january    90.0        NaN  9:00     NaN
3      june     NaN       20.0   NaN     NaN

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

0

Python3: Большинство ранее представленных решений работают. Тем не менее, бывают случаи, когда номер строки в DataFrame не нужен, и необходимо записывать каждую строку (запись) индивидуально.

В таком случае полезным будет следующий метод.

import csv

myfile = 'C:\\Users\\John\\Desktop\\export_dataframe.csv'

records_to_save = data2  # Используется, как в теме обсуждения.

colnames = list(records_to_save[0].keys()) 
# помните, что colnames - это список всех ключей. Все значения будут записаны 
# в соответствии с ключами, а "None" указывается в случае отсутствующих значений.

with open(myfile, 'w', newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(colnames)
    for d in records_to_save:
        writer.writerow([d.get(r, "None") for r in colnames])

Этот код создает CSV файл, записывая все записи по отдельности, что может быть полезно в случае, когда требуется более точный контроль над выводом данных.

0

Самый простой способ, который я нашел для выполнения этой задачи, выглядит следующим образом:

dict_count = len(dict_list)
df = pd.DataFrame(dict_list[0], index=[0])  # Создаем DataFrame из первого словаря
for i in range(1, dict_count):  # Изменил на dict_count, чтобы включить последний словарь
    df = df.append(dict_list[i], ignore_index=True)  # Добавляем остальные словари

Обратите внимание, что метод append считается устаревшим в более новых версиях pandas. Рекомендуется использовать pd.concat для объединения DataFrame. Например:

df = pd.concat([pd.DataFrame(d) for d in dict_list], ignore_index=True)

Этот способ более эффективен и предпочтителен для работы с большими данными.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь