Coloque várias listas no dataframe

164

Como pego várias listas e as coloco como colunas diferentes em um quadro de dados python? Eu tentei esta solução, mas tive alguns problemas.

Tentativa 1:

  • Tenha três listas, junte-as e use-as res = zip(lst1,lst2,lst3)
  • Rende apenas uma coluna

Tentativa 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • produz uma linha por 3 colunas (o caminho acima) ou, se eu transpô-lo, é 3 linhas e 1 coluna

Como obtenho uma linha de dados de pandas de 100 linhas (comprimento de cada lista independente) por 3 colunas (três listas)?

jfalkson
fonte

Respostas:

279

Eu acho que você está quase lá, tente remover os colchetes extras ao redor do lst(também não é necessário especificar os nomes das colunas ao criar um quadro de dados a partir de um ditado 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
...

Se você precisar de uma solução com melhor desempenho, poderá usar np.column_stackmais do zipque na sua primeira tentativa, isso tem uma velocidade de 2x no exemplo aqui, no entanto, tem um custo de legibilidade na minha opinião:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
fonte
É np.column_stack uma visualização ou copia os dados. (Se copiar, parece que isso poderia ser muito mais eficiente (O (1), não O (n)). #
User48956 16/16
@maxymoo os nomes das colunas podem ser automaticamente definidos para o nome da lista?
joe5
1
pilha coluna numpy não funciona bem se as listas são de diferentes tipos de dados
user6386155
54

Adicionando à resposta do Aditya Guru aqui. Não há necessidade de usar o mapa. Você pode fazer isso simplesmente:

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

Isso definirá os nomes da coluna como 0,1,2. Para definir seus próprios nomes de coluna, você pode passar o argumento de palavra-chave columnspara o método acima.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Abhinav Gupta
fonte
3
No Python 3.8 e no Pandas 1.0, não precisamos usar a função list, pois o DataFrame espera um iterável e zip () retorna um objeto iterável. Então, pd.DataFrame(zip(lst1, lst2, lst3))também deve fazer.
Sarfraaz Ahmed 16/04
10

Basta adicionar que, usando a primeira abordagem, isso pode ser feito como -

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

Adicionando mais uma solução escalável.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
fonte
você pode explicar isso um pouco?
ZakS 18/07
1
Você junta (concat) série vertical (eixo = 1) para criar trama de dados a partir da lista de listas
yona Bendelac
5

Adicionando as respostas acima, podemos criar rapidamente

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

espero que ajude !

Vivek Ananthan
fonte
1

O @oopsi usou, pd.concat()mas não incluiu os nomes das colunas. Você pode fazer o seguinte, que, diferentemente da primeira solução na resposta aceita, oferece controle sobre a ordem das colunas (evita ditados, que não são 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
fonte
1

Existem várias maneiras de criar um quadro de dados a partir de várias 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
fonte
0

você pode simplesmente usar este código a seguir

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
fonte