Tetapkan urutan kolom dalam bingkai data panda


104

Apakah ada cara untuk menyusun ulang kolom dalam bingkai data panda berdasarkan preferensi pribadi saya (yaitu tidak diurutkan menurut abjad atau numerik, tetapi lebih seperti mengikuti konvensi tertentu)?

Contoh sederhana:

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

menghasilkan ini:

   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

Tapi sebaliknya, saya ingin ini:

   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

(Tolong, berikan solusi umum daripada khusus untuk kasus ini. Terima kasih banyak.)

Jawaban:


157

Cukup pilih pesanan Anda sendiri dengan mengetikkan nama kolom. Perhatikan tanda kurung ganda:

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

26
Ini hanya berfungsi dengan contoh yang agak kecil ini. Jika Anda membaca data dari sumber lain, seperti file csv atau tabel database, Anda tidak bisa menggunakan jawaban ini. Dan itu tampaknya jauh lebih umum. OP meminta solusi umum.
chrisfs

83

Anda dapat menggunakan ini:

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

frame = frame.reindex(columns=columnsTitles)

5
Meskipun sebagian besar solusi lain lebih ringkas, saya akan menganggap solusi ini paling mudah dibaca oleh siapa pun yang tidak 100% terbiasa pandas.
Dirk

3
Ingatlah untuk menetapkan nilai kembali ke variabel, ini tidak mengubah urutan kolom di tempat (setidaknya tidak di pandasv0.23`).
Dirk

Terima kasih @Dirk untuk saran
Okroshiashvili

33

Ini solusi yang sering saya gunakan. Ketika Anda memiliki kumpulan data yang besar dengan banyak kolom, Anda pasti tidak ingin mengatur ulang semua kolom secara manual.

Apa yang Anda bisa dan, kemungkinan besar, ingin lakukan adalah hanya mengurutkan beberapa kolom pertama yang sering Anda gunakan, dan membiarkan semua kolom lain menjadi dirinya sendiri. Ini adalah pendekatan umum di R.df %>%select(one, two, three, everything())

Jadi, Anda bisa terlebih dahulu mengetikkan kolom yang ingin diurutkan dan diposisikan sebelum semua kolom lain dalam daftar cols_to_order.

Kemudian Anda membuat daftar untuk kolom baru dengan menggabungkan kolom lainnya:

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

Setelah ini, Anda dapat menggunakan new_columnssolusi lain yang disarankan.

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
brilian, sempurna. terima kasih untuk menjaga saya dari harus mengetikkan setiap nama kolom atau indeks
stuart

Ini adalah jawaban umum dan seharusnya jawaban yang diterima
CarlosH

26

Anda juga bisa melakukan sesuatu seperti 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

Juga, Anda bisa mendapatkan daftar kolom dengan:

cols = list(df.columns.values)

Outputnya akan menghasilkan sesuatu seperti ini:

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

Yang kemudian mudah diatur ulang secara manual.


13

Bangunlah dengan daftar, bukan kamus

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

Saya tidak bisa mendapatkan 'nama kolom': data untuk bekerja di dalam daftar seperti halnya di sebuah dict.
Kim Miller

10

Anda juga dapat menggunakan OrderedDict:

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

Tambahkan parameter 'kolom':

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

Cobalah mengindeks (jadi Anda menginginkan solusi umum tidak hanya untuk ini, jadi urutan indeks bisa sesuai keinginan Anda):

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

Sekarang:

print(frame)

Adalah:

   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

Menurut saya ini yang paling mudah dan berhasil:

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']]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.