6

Преобразование словаря Python в DataFrame

18

У меня есть словарь 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 ответ(ов)

8

Ошибка заключается в том, что при вызове конструктора 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, добавив индексы в качестве колонок. Это делает код более понятным и структурированным.

0

Чтобы преобразовать элементы словаря в 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.

0

Вот что сработало для меня, так как я хотел иметь отдельный индексный столбец:

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

Здесь я создаю DataFrame из словаря с помощью pd.DataFrame.from_dict, указывая, что нужно ориентироваться по индексам. Затем я использую reset_index(), чтобы сбросить индекс и сделать его отдельным столбцом. В конце я переименовываю столбцы в 'A' и 'B'.

0

Вы можете создать DataFrame в pandas из словаря, где ключи будут значениями в одном столбце, а значения — в другом. Ваш код делает именно это. Вот шаги:

  1. dict_dates.keys() — извлекает ключи из словаря dict_dates, которые будут использоваться как значения в столбце date.
  2. dict_dates.values() — получает значения из того же словаря, которые будут в столбце date_value.
  3. 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 с двумя столбцами: один для дат и другой для соответствующих ценностей.

0

Это зависит от того, как вы хотите организовать ваши данные в DataFrame. Если вы хотите добавить элементы в DataFrame построчно, то используйте следующий код:

pd.DataFrame(dic.items(), columns=['Date', 'Value'])

В этом случае каждая пара ключ-значение из словаря dic будет занимать одну строку, где первая колонка будет содержать ключи (например, даты), а вторая — соответствующие значения.

Если же вам нужно добавить элементы столбцами, вы можете сделать это с помощью следующего подхода:

pd.DataFrame([dic])

Здесь весь словарь dic будет представлен в одной строке, а ключи словаря станут названиями столбцов, а значения будут соответствующими элементами в этой строке.

Выбор метода зависит от вашей задачи: хотите ли вы сохранить элементы в виде отдельных строк или же в одной строке с разными столбцами.

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