Đưa nhiều danh sách vào khung dữ liệu


164

Làm cách nào để lấy nhiều danh sách và đặt chúng dưới dạng các cột khác nhau trong khung dữ liệu python? Tôi đã thử giải pháp này nhưng gặp một số rắc rối.

Nỗ lực 1:

  • Có ba danh sách, và nén chúng lại với nhau và sử dụng nó res = zip(lst1,lst2,lst3)
  • Năng suất chỉ một cột

Cố gắng 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • mang lại một hàng bằng 3 cột (cách trên) hoặc nếu tôi hoán đổi thì đó là 3 hàng và 1 cột

Làm cách nào để tôi nhận được 100 hàng (độ dài của mỗi danh sách độc lập) theo 3 cột (ba danh sách) khung dữ liệu gấu trúc?

Câu trả lời:


279

Tôi nghĩ rằng bạn đã ở gần đó, hãy thử xóa dấu ngoặc vuông thêm xung quanh lst(Ngoài ra, bạn không cần chỉ định tên cột khi bạn đang tạo một khung dữ liệu từ một lệnh như thế này):

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

Nếu bạn cần một giải pháp hiệu quả hơn bạn có thể sử dụng np.column_stackthay vì zipnhư trong lần thử đầu tiên của mình, thì điều này có tốc độ tăng gấp 2 lần trong ví dụ ở đây, tuy nhiên theo tôi thì có một chút chi phí dễ đọc:

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

Là np.column_stack một chế độ xem, hoặc nó sao chép dữ liệu. (Nếu sao chép, có vẻ như điều này có thể hiệu quả hơn nhiều (O (1), không phải O (n)).
user48956

@maxymoo có thể tự động đặt tên cột thành tên danh sách không?
joe5

1
ngăn xếp cột numpy không hoạt động tốt nếu danh sách có các kiểu dữ liệu khác nhau
user6386155

54

Thêm vào câu trả lời của Aditya Guru ở đây. Không có nhu cầu sử dụng bản đồ. Bạn có thể làm điều đó đơn giản bằng cách:

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

Điều này sẽ đặt tên của cột là 0,1,2. Để đặt tên cột của riêng bạn, bạn có thể chuyển đối số từ khóa columnscho phương thức trên.

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

3
Trong Python 3.8 và Pandas 1.0, chúng ta không cần sử dụng hàm danh sách, vì DataFrame mong đợi một lần lặp và zip () trả về một đối tượng có thể lặp lại. Vì vậy, pd.DataFrame(zip(lst1, lst2, lst3))cũng nên làm.
Sarfraaz Ahmed

10

Chỉ cần thêm rằng sử dụng cách tiếp cận đầu tiên, nó có thể được thực hiện như -

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

8

Thêm một giải pháp mở rộng hơn.

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

bạn có thể giải thích điều này một chút không?
ZakS

1
Bạn tham gia chuỗi (concat) theo chiều dọc (trục = 1) để tạo DataFrame từ danh sách danh sách
yona bentelac

5

Thêm vào câu trả lời ở trên, chúng ta có thể tạo ra một cách nhanh chóng

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

hy vọng nó giúp !


1

@oopsi đã sử dụng pd.concat()nhưng không bao gồm tên cột. Bạn có thể thực hiện các thao tác sau, không giống như giải pháp đầu tiên trong câu trả lời được chấp nhận, cho phép bạn kiểm soát thứ tự cột (tránh các ký tự không được sắp xếp theo thứ tự):

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

Có một số cách để tạo một khung dữ liệu từ nhiều danh sách.

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

bạn có thể đơn giản sử dụng mã sau đây

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.