Преобразование списка словарей в DataFrame pandas
Как я могу преобразовать список словарей в 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 ответ(ов)
Если ds
— это список словарей (dict
), то для создания DataFrame в Pandas вы можете использовать следующий код:
df = pd.DataFrame(ds)
Однако обратите внимание, что этот подход не сработает, если ваши словари имеют вложенные структуры. В случае вложенных данных вам необходимо сначала распаковать их, чтобы получить плоский формат.
В версии pandas 16.2 мне пришлось использовать pd.DataFrame.from_records(d)
, чтобы это заработало.
Вы также можете использовать 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), если у записей отсутствуют некоторые ключи.
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 файл, записывая все записи по отдельности, что может быть полезно в случае, когда требуется более точный контроль над выводом данных.
Самый простой способ, который я нашел для выполнения этой задачи, выглядит следующим образом:
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)
Этот способ более эффективен и предпочтителен для работы с большими данными.
Как выбрать строки из DataFrame на основе значений столбцов?
Создание DataFrame в Pandas путём последовательного добавления строк
Выбор нескольких колонок в DataFrame Pandas
Объединение двух столбцов текста в DataFrame pandas
Получение списка из заголовков столбцов DataFrame в Pandas