Преобразование словаря Python в DataFrame
У меня есть словарь Python:
{u'2012-07-01': 391,
u'2012-07-02': 392,
u'2012-07-03': 392,
u'2012-07-04': 392,
u'2012-07-05': 392,
u'2012-07-06': 392}
Я хотел бы преобразовать его в DataFrame библиотеки pandas, чтобы даты и соответствующие значения находились в двух отдельных столбцах. Ожидаемый результат выглядит следующим образом:
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
. 2012-07-04 392
. ... ...
Существует ли прямой способ сделать это?
5 ответ(ов)
Ошибка заключается в том, что при вызове конструктора DataFrame с помощью скалярных значений (где ожидается, что значения будут в виде списка/словаря и т.д., то есть иметь несколько колонок):
pd.DataFrame(d)
ValueError: If using all scalar values, you must pass an index
Вы можете извлечь элементы из словаря (то есть пар ключ-значение):
In [11]: pd.DataFrame(d.items()) # или list(d.items()) в Python 3
Out[11]:
0 1
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
3 2012-07-04 392
4 2012-07-05 392
5 2012-07-06 392
In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
3 2012-07-04 392
4 2012-07-05 392
5 2012-07-06 392
Однако, я бы предложил более логичный подход — использовать конструктор Series:
In [20]: s = pd.Series(d, name='DateValue')
In [21]: s
Out[21]:
2012-07-01 391
2012-07-02 392
2012-07-03 392
2012-07-04 392
2012-07-05 392
2012-07-06 392
Name: DateValue, dtype: int64
In [22]: s.index.name = 'Date'
In [23]: s.reset_index()
Out[23]:
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
3 2012-07-04 392
4 2012-07-05 392
5 2012-07-06 392
Таким образом, вы создаете Series из словаря, а затем можно преобразовать ее в DataFrame, добавив индексы в качестве колонок. Это делает код более понятным и структурированным.
Чтобы преобразовать элементы словаря в DataFrame, нужно передать их в конструктор DataFrame, указав имена столбцов. Затем парсите столбец Date
, чтобы получить значения типа Timestamp
.
Обратите внимание на различия между Python 2.x и 3.x:
В Python 2.x код выглядит следующим образом:
df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])
В Python 3.x (требует дополнительного преобразования в 'list') код будет таким:
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])
Таким образом, в зависимости от версии Python вам нужно использовать либо data.items()
, либо list(data.items())
для создания DataFrame.
Вот что сработало для меня, так как я хотел иметь отдельный индексный столбец:
df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']
Здесь я создаю DataFrame из словаря с помощью pd.DataFrame.from_dict
, указывая, что нужно ориентироваться по индексам. Затем я использую reset_index()
, чтобы сбросить индекс и сделать его отдельным столбцом. В конце я переименовываю столбцы в 'A' и 'B'.
Вы можете создать DataFrame в pandas из словаря, где ключи будут значениями в одном столбце, а значения — в другом. Ваш код делает именно это. Вот шаги:
dict_dates.keys()
— извлекает ключи из словаряdict_dates
, которые будут использоваться как значения в столбцеdate
.dict_dates.values()
— получает значения из того же словаря, которые будут в столбцеdate_value
.pd.DataFrame({...})
— создает новый DataFrame, используя указанные ключи и значения.
Полный код, который вы привели, будет выглядеть следующим образом:
import pandas as pd
# Предположим, что dict_dates - это ваш словарь
dict_dates = {'2023-01-01': 100, '2023-01-02': 200}
# Создание DataFrame
df = pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
print(df)
В результате вы получите DataFrame с двумя столбцами: один для дат и другой для соответствующих ценностей.
Это зависит от того, как вы хотите организовать ваши данные в DataFrame
. Если вы хотите добавить элементы в DataFrame
построчно, то используйте следующий код:
pd.DataFrame(dic.items(), columns=['Date', 'Value'])
В этом случае каждая пара ключ-значение из словаря dic
будет занимать одну строку, где первая колонка будет содержать ключи (например, даты), а вторая — соответствующие значения.
Если же вам нужно добавить элементы столбцами, вы можете сделать это с помощью следующего подхода:
pd.DataFrame([dic])
Здесь весь словарь dic
будет представлен в одной строке, а ключи словаря станут названиями столбцов, а значения будут соответствующими элементами в этой строке.
Выбор метода зависит от вашей задачи: хотите ли вы сохранить элементы в виде отдельных строк или же в одной строке с разными столбцами.
Преобразование списка словарей в DataFrame pandas
Переопределение значений в колонке pandas с помощью словаря, сохраняя NaN значения
Объединение двух столбцов текста в DataFrame pandas
Получить список из колонки или строки DataFrame в pandas?
Выбор строки из pandas Series/DataFrame по целочисленному индексу