#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()