Объединение фрейма данных с данными dict в одном из его столбцов - PullRequest
0 голосов
/ 10 сентября 2018

Мои данные выглядят так:

>>> df = pd.DataFrame({'order_id': ['A', 'B'],
..                    'items': [[{'item': 1, 'color': 'blue' },
...                               {'item': 2, 'color': 'red'  }],
...                              [{'item': 3, 'color': 'green'},
...                               {'item': 2, 'color': 'pink' }]]},
...                   columns= ['order_id', 'items'])
>>> df
  order_id                                                          items
0        A    [{'item': 1, 'color': 'blue'}, {'item': 2, 'color': 'red'}]
1        B  [{'item': 3, 'color': 'green'}, {'item': 2, 'color': 'pink'}]

Столбец items содержит подсказки, которые я хочу иметь в качестве столбцов кадра данных:

  order_id        item         color
0        A           1          blue
1        A           2           red
2        B           3         green
3        B           2          pink

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

То, что я до сих пор делал, это итерация строка за строкой и создание данных в новом фрейме данных:

df2 = pd.DataFrame(columns=['order_id', 'item', 'color'])
for row in df.iterrows():
    for items in (row[1]['items']):
        df2.loc[-1] =[row[1]['order_id'], items['item'], items['color'] ]
        df2.index += 1

, который дает мне нужный мне результат:

>>> df2
  order_id item  color
3        A    1   blue
2        A    2    red
1        B    3  green
0        B    2   pink

Есть ли более эффективный способ сделать это? Может быть, на месте без создания другого объекта и дублирования всех существующих столбцов, потому что я имею дело с большими объемами данных?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

repeat, join, len

order_id = df.order_id.values.repeat(df['items'].str.len())
items = pd.DataFrame(np.concatenate(df['items']).tolist())

items.assign(order_id=order_id)

   color  item order_id
0   blue     1        A
1    red     2        A
2  green     3        B
3   pink     2        B

Постижение

pd.DataFrame([{**{'order_id': o}, **i} for o, I in df.values for i in I])

   color  item order_id
0   blue     1        A
1    red     2        A
2  green     3        B
3   pink     2        B
0 голосов
/ 10 сентября 2018

IIUC с использованием concat

pd.concat([pd.DataFrame(x) for x in df.set_index('order_id')['items']],keys=df.order_id).reset_index(level=0)
Out[486]: 
  order_id  color  item
0        A   blue     1
1        A    red     2
0        B  green     3
1        B   pink     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...