Prenez plusieurs listes dans le dataframe

165

Comment puis-je prendre plusieurs listes et les mettre en tant que colonnes différentes dans un dataframe python? J'ai essayé cette solution mais j'ai eu quelques problèmes.

Tentative 1:

  • Ayez trois listes, fermez-les ensemble et utilisez-les res = zip(lst1,lst2,lst3)
  • Donne une seule colonne

Tentative 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • donne soit une ligne par 3 colonnes (comme ci-dessus) soit si je transpose c'est 3 lignes et 1 colonne

Comment obtenir une trame de données pandas de 100 lignes (longueur de chaque liste indépendante) par 3 colonnes (trois listes)?

jfalkson
la source

Réponses:

280

Je pense que vous y êtes presque, essayez de supprimer les crochets supplémentaires autour des lst's (vous n'avez pas non plus besoin de spécifier les noms de colonne lorsque vous créez une trame de données à partir d'un dict comme celui-ci):

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 vous avez besoin d'une solution plus performante que vous pouvez utiliser np.column_stackplutôt que zipcomme lors de votre première tentative, cela a une accélération d'environ 2x sur l'exemple ici, mais cela a un coût de lisibilité à mon avis:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
la source
Np.column_stack est-il une vue ou copie-t-il les données. (Si vous copiez, il semble que cela pourrait être beaucoup plus efficace (O (1), pas O (n)).
user48956
@maxymoo les noms de colonnes peuvent-ils être automatiquement définis sur le nom de la liste?
joe5
1
La pile de colonnes numpy ne fonctionne pas bien si les listes sont de types de données différents
user6386155
54

Ajout à la réponse d' Aditya Guru ici. Il n'est pas nécessaire d'utiliser la carte. Vous pouvez le faire simplement en:

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

Cela définira les noms des colonnes comme 0,1,2. Pour définir vos propres noms de colonne, vous pouvez transmettre l'argument mot-clé columnsà la méthode ci-dessus.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Abhinav Gupta
la source
3
Dans Python 3.8 et Pandas 1.0, nous n'avons pas besoin d'utiliser la fonction de liste, puisque DataFrame attend un itérable, et zip () renvoie un objet itérable. Donc, pd.DataFrame(zip(lst1, lst2, lst3))devrait aussi faire.
Sarfraaz Ahmed le
10

En ajoutant simplement qu'en utilisant la première approche, cela peut être fait comme -

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

Ajout d'une autre solution évolutive.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
la source
pouvez-vous l'expliquer un peu?
ZakS
1
Vous joignez (concat) des séries verticalement (axe = 1) pour créer DataFrame à partir de la liste des listes
yona bendelac
5

En ajoutant aux réponses ci-dessus, nous pouvons créer à la volée

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

J'espère que ça aide !

Vivek Ananthan
la source
1

@oopsi a utilisé pd.concat()mais n'a pas inclus les noms de colonne. Vous pouvez faire ce qui suit, ce qui, contrairement à la première solution de la réponse acceptée, vous donne le contrôle sur l'ordre des colonnes (évite les dicts, qui ne sont pas ordonnés):

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
la source
1

Il existe plusieurs façons de créer une trame de données à partir de plusieurs listes.

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
la source
0

vous pouvez simplement utiliser ce code suivant

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
la source