Inserisci più elenchi nel frame di dati


165

Come posso prendere più elenchi e inserirli come colonne diverse in un frame di dati Python? Ho provato questa soluzione ma ho avuto qualche problema.

Tentativo 1:

  • Hai tre elenchi, comprimili e usali res = zip(lst1,lst2,lst3)
  • Produce solo una colonna

Tentativo 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • produce una riga per 3 colonne (il modo sopra) o se traspongo è 3 righe e 1 colonna

Come posso ottenere un frame di dati panda di 100 righe (lunghezza di ogni elenco indipendente) per 3 colonne (tre elenchi)?

Risposte:


280

Penso che tu sia quasi lì, prova a rimuovere le parentesi quadre extra attorno a quelle lst(Inoltre non devi specificare i nomi delle colonne quando crei un frame di dati da un dict come questo):

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 hai bisogno di una soluzione più performante che puoi usare np.column_stackpiuttosto che zipcome nel tuo primo tentativo, questo ha circa una velocità 2x sull'esempio qui, tuttavia secondo me costa un po 'di leggibilità:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])

Np.column_stack è una vista o copia i dati? (Se copia, sembra che questo potrebbe essere molto più efficiente (O (1), non O (n)).
user48956

@maxymoo è possibile impostare automaticamente i nomi delle colonne sul nome dell'elenco?
joe5,

1
lo stack di colonne numpy non funziona bene se gli elenchi sono di tipi di dati diversi
user6386155

54

Aggiungendo alla risposta di Aditya Guru qui. Non è necessario utilizzare la mappa. Puoi farlo semplicemente:

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

Questo imposterà i nomi della colonna come 0,1,2. Per impostare i nomi delle tue colonne, puoi passare l'argomento della parola chiave columnsal metodo sopra.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])

3
In Python 3.8 e Pandas 1.0, non è necessario utilizzare la funzione list, poiché DataFrame si aspetta un iterabile e zip () restituisce un oggetto iterabile. Quindi, pd.DataFrame(zip(lst1, lst2, lst3))dovrebbe anche fare.
Sarfraaz Ahmed,

10

Basta aggiungere che usando il primo approccio può essere fatto come -

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

8

Aggiunta di un'altra soluzione scalabile.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)

puoi spiegarlo un po '?
ZakS,

1
Unisci le serie (concat) in verticale (axis = 1) per creare DataFrame dall'elenco degli elenchi
yona bendelac

5

Aggiungendo alle risposte di cui sopra, possiamo creare al volo

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

spero che sia d'aiuto !


1

@oopsi utilizzato pd.concat()ma non includeva i nomi delle colonne. Potresti fare quanto segue, che, a differenza della prima soluzione nella risposta accettata, ti dà il controllo sull'ordine delle colonne (evita i dadi, che non sono ordinati):

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
...

1

Esistono diversi modi per creare un frame di dati da più elenchi.

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'])


0

puoi semplicemente usare questo codice seguente

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.