Nehmen Sie mehrere Listen in den Datenrahmen auf


164

Wie nehme ich mehrere Listen und füge sie als unterschiedliche Spalten in einen Python-Datenrahmen ein? Ich habe diese Lösung ausprobiert , hatte aber einige Probleme.

Versuch 1:

  • Haben Sie drei Listen, komprimieren Sie sie und verwenden Sie diese res = zip(lst1,lst2,lst3)
  • Ergibt nur eine Spalte

Versuch 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • ergibt entweder eine Zeile mal 3 Spalten (wie oben) oder wenn ich transponiere, sind es 3 Zeilen und 1 Spalte

Wie erhalte ich einen Pandas-Datenrahmen mit 100 Zeilen (Länge jeder unabhängigen Liste) und 3 Spalten (drei Listen)?

Antworten:


279

Ich denke, Sie sind fast da. Entfernen Sie die zusätzlichen eckigen Klammern um die lst's (Außerdem müssen Sie die Spaltennamen nicht angeben, wenn Sie einen Datenrahmen aus einem Diktat wie diesem erstellen):

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

Wenn Sie eine leistungsfähigere Lösung benötigen, die Sie verwenden können, np.column_stackanstatt zipwie bei Ihrem ersten Versuch, hat dies eine etwa zweifache Beschleunigung des Beispiels hier, ist jedoch meiner Meinung nach mit einigen Kosten für die Lesbarkeit verbunden:

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

Ist np.column_stack eine Ansicht oder kopiert es die Daten? (Wenn kopiert, scheint es, dass dies viel effizienter sein könnte (O (1), nicht O (n)).
user48956

@maxymoo Können Spaltennamen automatisch auf den Listennamen gesetzt werden?
Joe5

1
numpy Spaltenstapel funktioniert nicht gut, wenn die Listen von verschiedenen Datentypen sind
user6386155

54

Hinzufügen zu Aditya Gurus Antwort hier. Es ist nicht erforderlich, eine Karte zu verwenden. Sie können es einfach tun durch:

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

Dadurch werden die Spaltennamen auf 0,1,2 festgelegt. Um Ihre eigenen Spaltennamen festzulegen, können Sie das Schlüsselwortargument columnsan die obige Methode übergeben.

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

3
In Python 3.8 und Pandas 1.0 müssen wir die Listenfunktion nicht verwenden, da DataFrame ein iterierbares Objekt erwartet und zip () ein iterierbares Objekt zurückgibt. Also pd.DataFrame(zip(lst1, lst2, lst3))sollte es auch tun.
Sarfraaz Ahmed

10

Wenn Sie dies nur mit dem ersten Ansatz hinzufügen, können Sie Folgendes tun:

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

8

Hinzufügen einer weiteren skalierbaren Lösung.

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

Kannst du das ein bisschen erklären?
ZakS

1
Sie verbinden (concat) Serien vertikal (Achse = 1), um DataFrame aus der Liste der Listen zu erstellen
Yona Bendelac

5

Zusätzlich zu den obigen Antworten können wir im laufenden Betrieb erstellen

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

ich hoffe es hilft !


1

@oopsi verwendet pd.concat(), aber nicht die Spaltennamen enthalten. Sie können Folgendes tun, was Ihnen im Gegensatz zur ersten Lösung in der akzeptierten Antwort die Kontrolle über die Spaltenreihenfolge gibt (vermeidet ungeordnete Diktate):

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

Es gibt verschiedene Möglichkeiten, einen Datenrahmen aus mehreren Listen zu erstellen.

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

Sie können diesen folgenden Code einfach verwenden

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.