Tome múltiples listas en el marco de datos

164

¿Cómo tomo varias listas y las pongo como columnas diferentes en un marco de datos de Python? Probé esta solución pero tuve algunos problemas.

Intento 1:

  • Ten tres listas, y únelas y úsalas res = zip(lst1,lst2,lst3)
  • Produce solo una columna

Intento 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • produce una fila por 3 columnas (el camino de arriba) o si transpongo son 3 filas y 1 columna

¿Cómo obtengo un marco de datos de pandas de 100 filas (longitud de cada lista independiente) por 3 columnas (tres listas)?

jfalkson
fuente

Respuestas:

279

Creo que ya casi está allí, intente eliminar los corchetes adicionales alrededor de los lst's (Además, no necesita especificar los nombres de columna cuando crea un marco de datos a partir de un dict como este):

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)
percentile_list = pd.DataFrame(
    {'lst1Title': lst1,
     'lst2Title': lst2,
     'lst3Title': lst3
    })

percentile_list
    lst1Title  lst2Title  lst3Title
0          0         0         0
1          1         1         1
2          2         2         2
3          3         3         3
4          4         4         4
5          5         5         5
6          6         6         6
...

Si necesita una solución más eficaz que pueda usar en np.column_stacklugar de zipcomo en su primer intento, esto tiene una aceleración de 2 veces en el ejemplo aquí, sin embargo, en mi opinión, tiene un costo de legibilidad:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
fuente
¿Es np.column_stack una vista o copia los datos? (Si copia, parece que esto podría ser mucho más eficiente (O (1), no O (n)).
user48956
@maxymoo ¿se pueden establecer automáticamente los nombres de columna en el nombre de la lista?
joe5
1
la pila de columnas numpy no funciona bien si las listas son de diferentes tipos de datos
user6386155
54

Agregando a la respuesta de Aditya Guru aquí. No hay necesidad de usar el mapa. Puedes hacerlo simplemente por:

pd.DataFrame(list(zip(lst1, lst2, lst3)))

Esto establecerá los nombres de las columnas como 0,1,2. Para establecer sus propios nombres de columna, puede pasar el argumento de la palabra clave columnsal método anterior.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Abhinav Gupta
fuente
3
En Python 3.8 y Pandas 1.0, no necesitamos usar la función de lista, ya que DataFrame espera un iterable, y zip () devuelve un objeto iterable. Entonces, pd.DataFrame(zip(lst1, lst2, lst3))también debería hacerlo.
Sarfraaz Ahmed
10

Simplemente agregue que usando el primer enfoque se puede hacer como:

pd.DataFrame(list(map(list, zip(lst1,lst2,lst3))))
Aditya Guru
fuente
8

Agregar una solución más escalable.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
fuente
¿Puedes explicar esto un poco?
ZakS
1
Se une a la serie (concat) verticalmente (axis = 1) para crear DataFrame de la lista de listas
yona bendelac
5

Agregando a las respuestas anteriores, podemos crear sobre la marcha

df= pd.DataFrame()
list1 = list(range(10))
list2 = list(range(10,20))
df['list1'] = list1
df['list2'] = list2
print(df)

Espero eso ayude !

Vivek Ananthan
fuente
1

@oopsi usó pd.concat()pero no incluyó los nombres de columna. Puede hacer lo siguiente, que, a diferencia de la primera solución en la respuesta aceptada, le da control sobre el orden de las columnas (evita los dictados, que no están ordenados):

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)

s1=pd.Series(lst1,name='lst1Title')
s2=pd.Series(lst2,name='lst2Title')
s3=pd.Series(lst3 ,name='lst3Title')
percentile_list = pd.concat([s1,s2,s3], axis=1)

percentile_list
Out[2]: 
    lst1Title  lst2Title  lst3Title
0           0          0          0
1           1          1          1
2           2          2          2
3           3          3          3
4           4          4          4
5           5          5          5
6           6          6          6
7           7          7          7
8           8          8          8
...
Dabru
fuente
1

Hay varias formas de crear un marco de datos a partir de múltiples listas.

list1=[1,2,3,4]
list2=[5,6,7,8]
list3=[9,10,11,12]
  1. pd.DataFrame({'list1':list1, 'list2':list2, 'list3'=list3})

  2. pd.DataFrame(data=zip(list1,list2,list3),columns=['list1','list2','list3'])

Reetesh Kumar
fuente
0

simplemente puede usar este siguiente código

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
Shaina Raza
fuente