นำหลายรายการไปไว้ใน dataframe


164

ฉันจะรับหลายรายการและวางเป็นคอลัมน์ต่าง ๆ ใน python dataframe ได้อย่างไร ฉันลองวิธีนี้แต่มีปัญหา

ความพยายามที่ 1:

  • มีสามรายการแล้วบีบเข้าด้วยกันแล้วใช้มัน res = zip(lst1,lst2,lst3)
  • ให้ผลเพียงหนึ่งคอลัมน์

พยายาม 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • ให้ผลตอบแทนหนึ่งแถว 3 คอลัมน์ (ทางด้านบน) หรือถ้าฉันเปลี่ยนเป็น 3 แถวและ 1 คอลัมน์

ฉันจะได้รับ 100 แถว (ความยาวของแต่ละรายการอิสระ) ได้อย่างไรโดย 3 คอลัมน์ (สามรายการ) pandas dataframe

คำตอบ:


279

ฉันคิดว่าคุณเกือบจะอยู่ที่นั่นแล้วลองลบวงเล็บเหลี่ยมพิเศษรอบ ๆlst(นอกจากนี้คุณไม่จำเป็นต้องระบุชื่อคอลัมน์เมื่อคุณสร้างชื่อไฟล์จาก dict เช่นนี้):

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

หากคุณต้องการวิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นคุณสามารถใช้งานได้np.column_stackมากกว่าzipในครั้งแรกนี่เป็นตัวอย่างที่รวดเร็วประมาณ 2 เท่าอย่างไรก็ตามความสามารถในการอ่านของฉันมีดังนี้

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

เป็น np.column_stack มุมมองหรือคัดลอกข้อมูล (หากคัดลอกดูเหมือนว่านี้จะมีประสิทธิภาพมากขึ้น (O (1) ไม่ใช่ O (n)))
user48956

@maxymoo สามารถตั้งชื่อคอลัมน์เป็นชื่อรายการโดยอัตโนมัติได้หรือไม่
joe5

1
คอลัมน์สแต็คจำนวนมากทำงานได้ไม่ดีหากรายการมีประเภทข้อมูลที่แตกต่างกัน
user6386155

54

กำลังเพิ่มคำตอบของAditya Guruที่นี่ ไม่จำเป็นต้องใช้แผนที่ คุณสามารถทำได้ง่ายๆโดย:

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

จะตั้งชื่อคอลัมน์เป็น 0,1,2 หากต้องการตั้งชื่อคอลัมน์ของคุณเองคุณสามารถส่งอาร์กิวเมนต์คำหลักcolumnsเป็นวิธีการด้านบน

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

3
ใน Python 3.8 และ Pandas 1.0 เราไม่จำเป็นต้องใช้ฟังก์ชั่น list เนื่องจาก DataFrame คาดว่า iterable และ zip () จะส่งคืนอ็อบเจกต์ iterable ดังนั้นpd.DataFrame(zip(lst1, lst2, lst3))ควรทำเช่นกัน
Sarfraaz Ahmed

10

เพียงเพิ่มที่ใช้วิธีแรกก็สามารถทำได้เช่น -

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

8

การเพิ่มโซลูชันที่ปรับขนาดได้อีกหนึ่งรายการ

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

คุณช่วยอธิบายหน่อยได้ไหม?
ZakS

1
คุณเข้าร่วม (concat) ซีรี่ส์ในแนวตั้ง (axis = 1) เพื่อสร้าง DataFrame จากรายการ
yona bendelac

5

เมื่อเพิ่มคำตอบข้างต้นเราสามารถสร้างได้ทันที

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

หวังว่ามันจะช่วย!


1

@oopsi ใช้แล้วpd.concat()แต่ไม่ได้รวมชื่อคอลัมน์ คุณสามารถทำสิ่งต่อไปนี้ซึ่งแตกต่างจากโซลูชันแรกในคำตอบที่ยอมรับให้คุณควบคุมลำดับคอลัมน์ (หลีกเลี่ยง dicts ซึ่งไม่ได้เรียงลำดับ):

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

มีหลายวิธีในการสร้าง dataframe จากหลายรายการ

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

คุณสามารถใช้รหัสต่อไปนี้ได้ง่าย ๆ

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.