Pandas DataFrame explotar el contenido de la columna

Tengo un pandas.core.frame.DataFrame que se ve así:

  0 1 0 [1,2,3] 1 1 [2,2,1] 1 2 [1,2,1] 1 ... 

La última columna es la etiqueta y se supone que cada una de las matrices de la columna ‘0’ son puntos de datos diferentes para una clase determinada.

Quiero que esto se convierta en:

  x0 x1 x2 label 0 1 2 3 1 1 2 2 1 1 2 1 2 1 1 

He intentado lo siguiente sin suerte

 ds = ds.apply(lambda x: numpy.ravel(x)) 

Ese fue el resultado de lo siguiente, obviamente esa no es la forma correcta de hacer esto.

 .extend(zip(points,labels)) ds = pandas.core.frame.DataFrame(data=) 

Se agradece cualquier ayuda sobre cómo arreglar el conjunto de datos real o crearlo correctamente con las dos listas (puntos y tags).

Así es como lo haría. Primero elimine su 1 columna (para no ensuciar los nombres):

 df['id'] = df[1] df = df.drop(1, axis = 1) 

Luego cree un objs, con lo que queremos concat, y concat:

 objs = [df, pd.DataFrame(df[0].tolist())] pd.concat(objs, axis=1) 0 id 0 1 2 0 [1, 2, 3] 1 1 2 3 1 [2, 2, 1] 1 2 2 1 2 [1, 2, 1] 1 1 2 1 

Supongo que los títulos de sus columnas actuales son texto en lugar de números enteros.

 df2 = pd.concat([pd.DataFrame(zip(*df['0'])), df['1']], axis=1) df2.columns = ['x' + str(c) for c in df2.columns[:-1]] + ['label'] >>> df2 x0 x1 x2 label 0 1 2 1 1 1 2 2 2 1 2 3 1 1 1 

zip usado con el operador * descomprime la lista:

 >>> zip(*df['0']) [(1, 2, 1), (2, 2, 2), (3, 1, 1)] 

Para que pueda ampliar fácilmente su dataframe:

 >>> pd.DataFrame(zip(*df['0'])) 0 1 2 0 1 2 1 1 2 2 2 2 3 1 1 

A continuación, solo debe concatenar la última columna y cambiar el nombre de todas las columnas.

Puede crear su dataframe de manera diferente para obtener lo que desea en lugar de intentar explotar la columna. Ver codigo abajo,

 import pandas as pd points = [[1,2,3],[2,2,1],[1,2,1]] labels = [1,1,1] x0 = [p[0] for p in points] x1 = [p[1] for p in points] x2 = [p[2] for p in points] df = pd.DataFrame({'x0': x0,'x1': x1,'x2': x2, 'label': labels}) print (df) 

Llegar,

  label x0 x1 x2 0 1 1 2 3 1 1 2 2 1 2 1 1 2 1 

Lo mejor que puedo ofrecer:

 import numpy as np # first convert your lists to an array, then iterate tmp = np.array( df[0].tolist() ) for r in np.arange(0,3): df['x' + str(r)] = tmp[:,r]