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

durbachit
sumber

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.]]
A.Kot
sumber
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)
Okroshiashvili
sumber
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
Lala La
sumber
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.

omri_saadon
sumber
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
piRSquared
sumber
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
MaxU
sumber
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']
)
irene
sumber
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
U10-Maju
sumber
-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']]
Sando K
sumber