Pandas Series de listas para una serie.

Tengo una serie de pandas de listas de cuerdas:

0 [slim, waist, man] 1 [slim, waistline] 2 [santa] 

Como puedes ver, las listas varían según la longitud. Quiero una forma eficiente de colapsar esto en una serie

 0 slim 1 waist 2 man 3 slim 4 waistline 5 santa 

Sé que puedo dividir las listas usando

 series_name.split(' ') 

Pero me cuesta mucho volver a poner esas cadenas en una lista.

¡Gracias!

Básicamente estás tratando de aplanar una lista anidada aquí.

Solo deberías poder iterar sobre los elementos de la serie:

 slist =[] for x in series: slist.extend(x) 

o una lista de comprensión (pero más difícil de entender):

 slist = [st for row in s for st in row] 

Aquí hay un método simple usando solo las funciones de pandas:

 import pandas as pd s = pd.Series([ ['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']]) 

Entonces

 s.apply(pd.Series).stack().reset_index(drop=True) 

Da la salida deseada. En algunos casos, es posible que desee guardar el índice original y agregar un segundo nivel para indexar los elementos nesteds, por ejemplo,

 0 0 slim 1 waist 2 man 1 0 slim 1 waistline 2 0 santa 

Si esto es lo que desea, simplemente omita .reset_index(drop=True) de la cadena.

Puedes intentar usar itertools.chain para simplemente aplanar las listas:

 In [70]: from itertools import chain In [71]: import pandas as pnd In [72]: s = pnd.Series([['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']]) In [73]: s Out[73]: 0 [slim, waist, man] 1 [slim, waistline] 2 [santa] dtype: object In [74]: new_s = pnd.Series(list(chain(*s.values))) In [75]: new_s Out[75]: 0 slim 1 waist 2 man 3 slim 4 waistline 5 santa dtype: object 
 series_name.sum() 

hace exactamente lo que necesitas. Asegúrese de que sea una serie de listas; de lo contrario, sus valores se concatenarán (si es una cadena) o se agregarán (si es int)

Puede utilizar el operador de concatenación de listas como a continuación:

 lst1 = ['hello','world'] lst2 = ['bye','world'] newlst = lst1 + lst2 print(newlst) >> ['hello','world','bye','world'] 

O puede usar la función list.extend() como se muestra a continuación:

 lst1 = ['hello','world'] lst2 = ['bye','world'] lst1.extend(lst2) print(lst1) >> ['hello', 'world', 'bye', 'world'] 

Los beneficios de usar la función de extend es que puede funcionar en varios tipos, donde un operador de concatenation solo funcionará si tanto LHS como RHS son listas.

Otros ejemplos de función de extend

 lst1.extend(('Bye','Bye')) >> ['hello', 'world', 'Bye', 'Bye'] 

El aplanamiento y la descalcificación se pueden hacer usando esta función

 def flatten(df, col): col_flat = pd.DataFrame([[i, x] for i, y in df[col].apply(list).iteritems() for x in y], columns=['I', col]) col_flat = col_flat.set_index('I') df = df.drop(col, 1) df = df.merge(col_flat, left_index=True, right_index=True) return df 

Aplanamiento

 def unflatten(flat_df, col): flat_df.groupby(level=0).agg({**{c:'first' for c in flat_df.columns}, col: list}) 

Después de la desconexión, obtenemos el mismo dataframe, excepto el orden de las columnas:

 (df.sort_index(axis=1) == unflatten(flatten(df)).sort_index(axis=1)).all().all() >> True