กำหนดลำดับของคอลัมน์ในดาต้าเฟรมของแพนด้า


105

มีวิธีจัดเรียงคอลัมน์ใหม่ในดาต้าเฟรมของแพนด้าตามความต้องการส่วนตัวของฉันหรือไม่ (เช่นไม่เรียงตามตัวอักษรหรือตัวเลข แต่เหมือนกับการทำตามอนุสัญญาบางอย่าง)

ตัวอย่างง่ายๆ:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

สร้างสิ่งนี้:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

แต่ฉันต้องการสิ่งนี้แทน:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(โปรดระบุวิธีแก้ปัญหาทั่วไปแทนที่จะเฉพาะเจาะจงสำหรับกรณีนี้ขอบคุณมาก)

คำตอบ:


159

เพียงแค่เลือกคำสั่งซื้อด้วยตัวคุณเองโดยพิมพ์ชื่อคอลัมน์ สังเกตวงเล็บคู่:

frame = frame[['column I want first', 'column I want second'...etc.]]

26
ใช้ได้กับตัวอย่างที่ค่อนข้างเล็กนี้เท่านั้น หากคุณกำลังอ่านข้อมูลจากแหล่งอื่นเช่นไฟล์ csv หรือตารางฐานข้อมูลคุณจะใช้คำตอบนี้ไม่ได้ และสิ่งเหล่านี้ดูเหมือนจะเป็นเรื่องธรรมดามาก OP ขอวิธีแก้ปัญหาทั่วไป
chrisfs

84

คุณสามารถใช้สิ่งนี้:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)

6
แม้ว่าโซลูชั่นอื่น ๆ ส่วนใหญ่จะกระชับมากขึ้นผมจะพิจารณาเรื่องนี้อย่างใดอย่างหนึ่งที่จะเป็นผู้อ่านมากที่สุดสำหรับใครที่ไม่ได้ 100% pandasคุ้นเคยกับ
Dirk

3
อย่าลืมกำหนดค่าส่งคืนให้กับตัวแปรแม้ว่าจะไม่แก้ไขลำดับคอลัมน์ในตำแหน่ง (อย่างน้อยก็ไม่ใช่ในpandasv0.23`)
Dirk

ขอบคุณ @Dirk สำหรับคำแนะนำ
Okroshiashvili

34

นี่คือวิธีแก้ปัญหาที่ฉันใช้บ่อยมาก เมื่อคุณมีชุดข้อมูลขนาดใหญ่ที่มีคอลัมน์จำนวนมากคุณไม่ต้องการจัดเรียงคอลัมน์ทั้งหมดใหม่ด้วยตนเอง

สิ่งที่คุณทำได้และเป็นไปได้มากที่สุดคือการจัดลำดับคอลัมน์สองสามคอลัมน์แรกที่คุณใช้บ่อยและปล่อยให้คอลัมน์อื่น ๆ เป็นตัวของตัวเอง นี่เป็นแนวทางทั่วไปใน Rdf %>%select(one, two, three, everything())

ดังนั้นก่อนอื่นคุณสามารถพิมพ์คอลัมน์ที่คุณต้องการเรียงลำดับและวางตำแหน่งก่อนคอลัมน์อื่น ๆ ทั้งหมดในรายการcols_to_orderได้ด้วยตนเอง

จากนั้นสร้างรายการสำหรับคอลัมน์ใหม่โดยการรวมคอลัมน์ที่เหลือ:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

หลังจากนี้คุณสามารถใช้new_columnsวิธีแก้ปัญหาอื่น ๆ ที่แนะนำ

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o

1
ยอดเยี่ยมสมบูรณ์แบบ ขอขอบคุณสำหรับการทำให้ฉันจากที่มีการพิมพ์ชื่อทุกคอลัมน์หรือดัชนี
Stuart

นี่คือคำตอบทั่วไปและควรเป็นคำตอบที่ยอมรับ
CarlosH

26

คุณยังสามารถทำสิ่งต่างๆเช่น df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

นอกจากนี้คุณสามารถรับรายการคอลัมน์ด้วย:

cols = list(df.columns.values)

ผลลัพธ์จะให้ผลลัพธ์ดังนี้:

['x', 'y', 'a', 'b']

ซึ่งง่ายต่อการจัดเรียงใหม่ด้วยตนเอง


13

สร้างด้วยรายการแทนพจนานุกรม

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

ฉันไม่สามารถรับ 'ชื่อคอลัมน์': ข้อมูลที่จะทำงานภายในรายการได้เหมือนในคำสั่ง
Kim Miller

10

คุณยังสามารถใช้ OrderDict:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

6

เพิ่มพารามิเตอร์ "คอลัมน์":

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)

4

ลองสร้างดัชนี (ดังนั้นคุณต้องการโซลูชันทั่วไปไม่เพียง แต่สำหรับสิ่งนี้ดังนั้นลำดับดัชนีอาจเป็นเพียงสิ่งที่คุณต้องการ):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

ตอนนี้:

print(frame)

คือ:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

-2

ฉันพบว่าสิ่งนี้ตรงไปตรงมาและใช้ได้ผลที่สุด:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

df = df[['one thing','second thing', 'other thing']]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.