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)?

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

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

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

8

Ajout d'une autre solution évolutive.

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

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 !


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

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


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'])
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.