Przenieś wiele list do ramki danych

164

Jak wziąć wiele list i umieścić je jako różne kolumny w ramce danych Pythona? Wypróbowałem to rozwiązanie, ale miałem problemy.

Próba 1:

  • Miej trzy listy, spakuj je razem i użyj tego res = zip(lst1,lst2,lst3)
  • Daje tylko jedną kolumnę

Próba 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • daje albo jeden wiersz na 3 kolumny (sposób powyżej), albo jeśli transponuję, to jest to 3 wiersze i 1 kolumna

Jak uzyskać 100 wierszy (długość każdej niezależnej listy) w 3 kolumnach (trzy listy) pandas dataframe?

jfalkson
źródło

Odpowiedzi:

279

Myślę, że prawie jesteś na miejscu, spróbuj usunąć dodatkowe nawiasy kwadratowe wokół lst's (również nie musisz określać nazw kolumn, gdy tworzysz ramkę danych z dyktu takiego jak ten):

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

Jeśli potrzebujesz bardziej wydajnego rozwiązania, którego możesz użyć, np.column_stacka nie zipjak przy pierwszej próbie, ma to około dwukrotne przyspieszenie w tym przykładzie, jednak moim zdaniem kosztuje trochę czytelności:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
źródło
Czy np.column_stack jest widokiem, czy kopiuje dane. (Jeśli kopiujesz, wydaje się, że może to być znacznie bardziej wydajne (O (1), a nie O (n)).
user48956
@maxymoo czy nazwy kolumn mogą być automatycznie ustawione na nazwę listy?
joe5
1
Stos kolumn numpy nie działa dobrze, jeśli listy mają różne typy danych
user6386155
54

Dodawanie do odpowiedzi Aditya Guru tutaj. Nie ma potrzeby korzystania z mapy. Możesz to zrobić po prostu:

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

Spowoduje to ustawienie nazw kolumn na 0,1,2. Aby ustawić własne nazwy kolumn, możesz przekazać argument słowa kluczowego columnsdo powyższej metody.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Abhinav Gupta
źródło
3
W Pythonie 3.8 i Pandas 1.0 nie musimy używać funkcji list, ponieważ DataFrame oczekuje iterowalnego, a zip () zwraca iterowalny obiekt. Tak pd.DataFrame(zip(lst1, lst2, lst3))też powinno.
Sarfraaz Ahmed
10

Dodając tylko, że używając pierwszego podejścia, można to zrobić jako -

pd.DataFrame(list(map(list, zip(lst1,lst2,lst3))))
Aditya Guru
źródło
8

Dodanie jeszcze jednego skalowalnego rozwiązania.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
źródło
czy możesz to trochę wyjaśnić?
ZakS,
1
Dołączeniu (concat) seria pionie (oś = 1), aby utworzyć DataFrame z listy list
Yona bendelac
5

Uzupełniając powyższe odpowiedzi, możemy tworzyć w locie

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

mam nadzieję, że to pomoże !

Vivek Ananthan
źródło
1

@oopsi używane, pd.concat()ale nie zawierało nazw kolumn. Możesz wykonać następujące czynności, które w przeciwieństwie do pierwszego rozwiązania w zaakceptowanej odpowiedzi, dają Ci kontrolę nad kolejnością kolumn (unika dykt, które są nieuporządkowane):

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
źródło
1

Istnieje kilka sposobów tworzenia ramki danych z wielu list.

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
źródło
0

możesz po prostu użyć tego następującego kodu

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
źródło