Python Pandas: импорт составного словаря списков для создания мультииндексированных DataFrame - PullRequest
2 голосов
/ 29 сентября 2019

Я импортировал некоторые данные в сложенный словарь списков, который имеет следующую структуру:

Структура 1:

{product_name : {category_name : { column_title_1 :[val1,val2,val3], column_title_2 :["string 1","string 2","string 3"], column_title_3 :["string 1a","string 2b","string 3c"] }}}

Структура 2:

{product_name : { column_title_1 :[val1,val2,val3], column_title_2 :["string 1","string 2","string 3"], column_title_3 :["string 1a","string 2b","string 3c"], "categories" :["category1","category1","category1"]}}}

И я хочу импортировать словарь в Pandas, чтобы он выглядел так:

df_Structure_1

--------------------------------column_title_1-----column_title_2-----column_title_3
product_name_1---category 1-----val_1         -----string 1      -----string 1a
--------------------------------val_2         -----string 2      -----string 2b
--------------------------------val_3         -----string 3      -----string 3c
-----------------category 2-----val_4         -----string 4      -----string 4d
--------------------------------val_5         -----string 5      -----string 5e
--------------------------------val_6         -----string 6      -----string 6f
product_name_2---category 1a----val_1         -----string 1      -----string 1a
--------------------------------val_2         -----string 2      -----string 2b
--------------------------------val_3         -----string 3      -----string 3c
-----------------category 2b----val_4         -----string 4      -----string 4d
--------------------------------val_5         -----string 5      -----string 5e
--------------------------------val_6         -----string 6      -----string 6f

т.е. есть multi_index как для названия продуктов, так и для категорий.

или df_Structure_2

--------------------------------column_title_1-----column_title_2-----column_title_3------category
product_name_1------------------val_1         -----string 1      -----string 1a     ------category1
--------------------------------val_2         -----string 2      -----string 2b     ------category1
--------------------------------val_3         -----string 3      -----string 3c     ------category1
--------------------------------val_4         -----string 4      -----string 4d     ------category2
--------------------------------val_5         -----string 5      -----string 5e     ------category2
--------------------------------val_6         -----string 6      -----string 6f     ------category2
product_name_2------------------val_1         -----string 1      -----string 1a     ------category1a
--------------------------------val_2         -----string 2      -----string 2b     ------category1a
--------------------------------val_3         -----string 3      -----string 3c     ------category1a
--------------------------------val_4         -----string 4      -----string 4d     ------category1b
--------------------------------val_5         -----string 5      -----string 5e     ------category1b
--------------------------------val_6         -----string 6      -----string 6f     ------category1b

Я просто попробовал

pd.DataFrame.from_dict(product_dict.items(), orient='index')

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

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

Спасибо.

1 Ответ

1 голос
/ 29 сентября 2019

Насколько я знаю, pandas.DataFrame.from_dict не создает мультииндексированные кадры данных. Кроме того, в вашем случае некоторые из ваших словарных ключей являются индексными, а другие - столбцами, поэтому вам нужно самостоятельно построить информационный фрейм.

Вы можете перебирать свои словари для составления списка информационных фреймов, используя словари ввнутренний вложенный уровень, а затем используйте pandas.concat , чтобы объединить их в один мультииндексированный фрейм данных.

Давайте начнем со структуры 2 (ss2 - словарь, следующий за структурой 2), которыйПроще:

df_list2 = [pd.DataFrame(v, index=pd.MultiIndex.from_product([[k], range(len(v[list(v)[0]]))])) for k, v in ss2.items()]
df2 = pd.concat(df_list2)

df_list2 - список фреймов данных, для каждого из которых мультииндекс уже подготовлен с использованием pandas.MultiIndex.from_product , поэтому при использовании concat результатприходит естественно. MultiIndex имеет 2 уровня: имя продукта и прогрессивное целое число для строк, имеющих одинаковое имя продукта.

Та же логика для структуры 1 (здесь ss1 - словарь`), но здесь итерацияболее сложный, поскольку в мультииндексе будет 3 уровня: название продукта, название категории и прогрессивное целое число.

df_list1 = [pd.DataFrame(iv, index=pd.MultiIndex.from_product([[k], [ik], range(len(iv[list(iv)[0]]))])) for k, v in ss1.items() for ik, iv in v.items()]
df1 = pd.concat(df_list1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...