Реструктурировать фрейм данных с помощью pandas

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

У меня есть следующий фрейм данных.

 a1 = [1,2,3]
a2 = [[[11,'a'],[12, 'b'],[13,'c']], [[21,'a'],[22, 'a']], [[31, 'b']]]

df = pd.DataFrame({'col1': a1,
                   'col2': a2})
  

    col1                         col2
0     1  [[11, a], [12, b], [13, c]]
1     2           [[21, a], [22, a]]
2     3                    [[31, b]]
  

И я хочу преобразовать его в этот фрейм данных

 c1   c2    c3
1    11    a
1    12    b
1    13    c
2    21    a
2    22    a
3    31    b
  

Кто-нибудь может показать мне, как это сделать. Большое спасибо.

Ответ №1:

Используйте DataFrame.explode для преобразования вложенных списков в ряды, а затем создайте новые столбцы с помощью DataFrame cosntructor:

 df = df.explode('col2').rename(columns={'col1':'c1'}).reset_index(drop=True)
df[['c2','c3']] = pd.DataFrame(df.pop('col2').tolist(), index=df.index)
print (df)
   c1  c2 c3
0   1  11  a
1   1  12  b
2   1  13  c
3   2  21  a
4   2  22  a
5   3  31  b
  

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

 L = [(v['col1'], x[0], x[1]) for k, v in df.to_dict('index').items() for x in v['col2']]

df = pd.DataFrame(L, columns=['c1','c2','c3'])
print (df)
   c1  c2 c3
0   1  11  a
1   1  12  b
2   1  13  c
3   2  21  a
4   2  22  a
5   3  31  b