Python: из словаря в csv с репликацией ключей по длине значений

#python #pandas #dictionary

#python #pandas #словарь

Вопрос:

У меня есть следующий словарь:

 import pandas as pd
dict_item = {'item1': ['bag', 'phone', 'laptop'],'item2': ['sofa', 'TV', 'bed', 'door', 'window'] }
  

и я хотел бы преобразовать его в csv, пока я пытался:

 df = df.append(pd.DataFrame(data={'item_number':dict_item.keys(),'items':dict_item.values()}))
df
  

но это дает мне следующее:

введите описание изображения здесь

Но я хотел бы получить следующее:

введите описание изображения здесь

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

P.S. Я создал желаемый результат вручную.

Спасибо, я был бы признателен за любую помощь

Ответ №1:

Просто используя DataFrame конструктор, затем stack

 s=pd.DataFrame(list(dict_item.values()),index=dict_item.keys()).stack().reset_index(level=0)
s.columns=['item_number','items']
s
Out[609]: 
  item_number   items
0       item1     bag
1       item1   phone
2       item1  laptop
0       item2    sofa
1       item2      TV
2       item2     bed
3       item2    door
4       item2  window
  

Комментарии:

1. Спасибо, это работает, но единственная проблема, с которой я столкнулся, — это индекс. Как вы видите из выходных данных, индекс начинает повторяться при переходе к следующему элементу. когда я использую sort_index() в этом случае у меня есть индекс, подобный : 0, 0, 1, 1, 2, 2 и т.д. у вас есть какие-либо предложения по этой проблеме?

2. @Sascha ты можешь добавить s.reset_index(drop=True,inplace=True)

Ответ №2:

Используйте json_normalize melt

 df = pd.io.json.json_normalize(dict_item)

expand(df.melt(), 'value')
  

где

 def expand(df, col):
    d = {c: df[c].values.repeat(df[col].str.len(), axis=0) for c in df.columns}
    d[col] = [i for sub in df[col] for i in sub]
    return pd.DataFrame(d)
  

Выводит

     variable    value
0   item1       bag
1   item1       phone
2   item1       laptop
3   item2       sofa
4   item2       TV
5   item2       bed
6   item2       door
7   item2       window
  

Другой вариант, с pd.DataFrame конструктором melt

 pd.DataFrame(dict_item.values(), index=dict_item.keys()).T.melt().dropna()