Tengo un marco de datos

enter image description here

Aquí tengo una columna llamada "nombre dividido", que es una columna con listas. Ahora quiero dividir el contenido de las listas y crear columnas separadas para cada uno.

Esto es lo que he intentado hasta ahora:

df = pd.read_csv("C:/Users/Transorg-PC/Desktop/Training/py/datase/football.csv")

temp = df.copy()

temp['name'] = temp['name'].apply(lambda x: ' '.join(x.split()))

temp['name split'] = temp['name'].apply(lambda x: x.split())

temp['length'] = temp['name split'].str.len()

for i in range(temp['length'].max()-1):
    temp[i] = temp['name split'].apply(lambda x:x[i])

Pero no puedo iterar de esta manera, ya que en algunos casos el índice se sale del límite. Entonces, cómo dividir el contenido de la lista en columnas separadas.

3
nOObda 22 feb. 2018 a las 21:02

3 respuestas

La mejor respuesta

Algo similar a los datos de jpp

pd.concat([df,pd.DataFrame(df.name.tolist())],1)
Out[1596]: 
   A    name  0  1
0  1  [1, 2]  1  2
1  1  [3, 4]  3  4
2  2  [5, 6]  5  6

Actualizar

df=pd.DataFrame([[1,[1, 2]],
                   [1,[3, 4]],
                   [2,[5, 6,1,1]]],
                  columns=['A','name'])
pd.concat([df,pd.DataFrame(df.name.tolist())],1)
Out[1602]: 
   A          name  0  1    2    3
0  1        [1, 2]  1  2  NaN  NaN
1  1        [3, 4]  3  4  NaN  NaN
2  2  [5, 6, 1, 1]  5  6  1.0  1.0
2
YOBEN_S 22 feb. 2018 a las 19:57

Esta es una forma:

df = pd.DataFrame([[1,[1, 2, 3]],
                   [1,[3, 4]],
                   [2,[5, 6, 7, 8]]],
                  columns=['A','name'])

df = df.join(pd.DataFrame(df['name'].tolist()))

#    A          name    0    1    2    3
# 0  1     [1, 2, 3]  1.0  2.0  3.0  NaN
# 1  1        [3, 4]  3.0  4.0  NaN  NaN
# 2  2  [5, 6, 7, 8]  5.0  6.0  7.0  8.0
2
jpp 22 feb. 2018 a las 20:03

Las comprensiones de listas son útiles en un caso como este:

temp['name'] = temp['name'].apply(lambda x: ' '.join(x.split()))
temp['Name1'] = [item.split()[0] for item in temp['name']]
temp['Name2'] = [item.split()[1] for item in temp['name']]

Editar: Acabo de notar que tiene un número diferente de elementos para cada entrada después de realizar la división. Debe decidir cómo manejar esto: ¿cómo desea llenar las filas vacías en la nueva columna? ¿Agregar una cadena vacía o NaN? Supongo que es por eso que obtienes un IndexError

Si desea hacer esto con un número diferente de elementos en cada fila, este código lo manejará por usted. Aunque, pensaría por qué quieres estas columnas no uniformes y si no hay una forma más limpia de lograr tu objetivo.

temp['name_split'] = temp['name'].apply(lambda a: a.split())
max_len = max(temp['name_split'].apply(len))

for ii in range(max_len):
    temp['Name%s'%ii] = [item[ii] if ii < len(item) else 'blank' for item in temp['name_split']]
0
Raw Dawg 22 feb. 2018 a las 20:04