Ambil beberapa daftar ke dalam bingkai data

164

Bagaimana cara saya mengambil beberapa daftar dan meletakkannya sebagai kolom yang berbeda dalam kerangka data python? Saya mencoba solusi ini tetapi mengalami beberapa masalah.

Percobaan 1:

  • Memiliki tiga daftar, dan kumpulkan bersama dan gunakan itu res = zip(lst1,lst2,lst3)
  • Menghasilkan hanya satu kolom

Percobaan 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • menghasilkan satu baris dengan 3 kolom (cara di atas) atau jika saya transpos, 3 baris dan 1 kolom

Bagaimana cara mendapatkan 100 baris (panjang dari setiap daftar independen) dengan 3 kolom (tiga daftar) bingkai data panda?

jfalkson
sumber

Jawaban:

279

Saya pikir Anda hampir sampai, coba hapus tanda kurung siku di sekitar tanda kurung lst(Juga Anda tidak perlu menentukan nama kolom saat Anda membuat kerangka data dari dict seperti ini):

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

Jika Anda membutuhkan solusi yang lebih berkinerja yang dapat Anda gunakan np.column_stackdaripada zipdalam upaya pertama Anda, ini memiliki sekitar 2x percepatan pada contoh di sini, namun datang pada sedikit biaya keterbacaan menurut pendapat saya:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
sumber
Apakah np.column_stack tampilan, atau apakah itu menyalin data. (Jika disalin, sepertinya ini bisa menjadi jauh lebih efisien (O (1), bukan O (n))
user48956
@maxymoo dapatkah nama kolom disetel secara otomatis ke nama daftar?
joe5
1
tumpukan kolom numpy tidak berfungsi dengan baik jika daftar datatypes berbeda
user6386155
54

Menambah jawaban Aditya Guru di sini. Tidak perlu menggunakan peta. Anda dapat melakukannya hanya dengan:

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

Ini akan menetapkan nama kolom sebagai 0,1,2. Untuk menetapkan nama kolom Anda sendiri, Anda dapat meneruskan argumen kata kunci columnske metode di atas.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Abhinav Gupta
sumber
3
Dalam Python 3.8, dan Pandas 1.0, kita tidak perlu menggunakan fungsi daftar, karena DataFrame mengharapkan iterable, dan zip () mengembalikan objek iterable. Jadi, pd.DataFrame(zip(lst1, lst2, lst3))juga harus dilakukan.
Sarfraaz Ahmed
10

Hanya menambahkan bahwa menggunakan pendekatan pertama itu bisa dilakukan sebagai -

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

Menambahkan satu lagi solusi yang dapat diskalakan.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
sumber
dapatkah kamu menjelaskan yang ini sedikit?
ZakS
1
Anda bergabung dengan (concat) seri secara vertikal (axis = 1) untuk membuat DataFrame dari daftar daftar
yona bendelac
5

Menambahkan ke jawaban di atas, kita dapat membuat dengan cepat

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

semoga membantu!

Vivek Ananthan
sumber
1

@opsi digunakan pd.concat()tetapi tidak menyertakan nama kolom. Anda bisa melakukan yang berikut ini, yang, tidak seperti solusi pertama dalam jawaban yang diterima, memberi Anda kendali atas urutan kolom (menghindari dikte, yang tidak berurutan):

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
sumber
1

Ada beberapa cara untuk membuat kerangka data dari banyak daftar.

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
sumber
0

Anda dapat dengan mudah menggunakan kode berikut ini

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
sumber