web-dev-qa-db-fra.com

Prendre plusieurs listes dans le cadre de données

Comment 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:

  • Avoir trois listes, et les compresser ensemble et utiliser cette res = Zip(lst1,lst2,lst3)
  • Donne juste une colonne

Tentative 2:

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

Comment puis-je obtenir 100 lignes (longueur de chaque liste indépendante) par 3 colonnes (trois listes) pandas dataframe?

129
jfalkson

Essayez de supprimer les crochets supplémentaires autour des lst (vous n'avez pas non plus besoin de spécifier les noms des colonnes lorsque vous créez un cadre 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, vous pouvez utiliser np.column_stack plutôt que Zip, car lors de votre première tentative, cet exemple a une vitesse environ deux fois plus rapide que l’exemple présenté ici, mais a un coût légèrement plus élevé en lecture opinion:

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

Ajout à la réponse de Aditya Gur 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 de colonne comme 0,1,2. Pour définir vos propres noms de colonne, vous pouvez passer le mot-clé argument columns à la méthode ci-dessus.

pd.DataFrame(list(Zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
38
Abhinav Gupta

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

pd.DataFrame(list(map(list, Zip(lst1,lst2,lst3))))
9
Aditya Guru

Ajout d'une solution évolutive supplémentaire.

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

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 !

3
Vivek Ananthan

@oopsi utilisait pd.concat() mais n'incluait pas les noms de colonnes. Vous pouvez effectuer les opérations suivantes, qui, contrairement à la première solution de la réponse acceptée, vous permettent de contrôler l’ordre des colonnes (évite les repères, 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,s3,s3], axis=1)

percentile_list
Out[32]: 
    lst1Title  lst3Title  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
...
0
dabru