Pandas veri çerçevesindeki sütunların sırasını ayarlayın


107

Pandas veri çerçevesindeki sütunları kişisel tercihlerime göre yeniden sıralamanın bir yolu var mı (yani alfabetik veya sayısal olarak sıralanmamış, ancak daha çok belirli kurallara uymak gibi)?

Basit örnek:

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

bunu üretir:

   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

Ama bunun yerine şunu isterim:

   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

(Lütfen bu vakaya özgü olmak yerine genel bir çözüm sağlayın. Çok teşekkürler.)

Yanıtlar:


162

Sütun adlarını yazarak sırayı kendiniz seçin. Çift köşeli parantezlere dikkat edin:

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

28
Bu sadece bu oldukça küçük örnekle işe yarar. Bir csv dosyası veya veritabanı tablosu gibi başka bir kaynaktan veri okuyorsanız, bu cevabı kullanamazsınız. Ve bunlar çok daha yaygın görünüyor. OP genel bir çözüm talep etti.
chrisfs

85

Bunu kullanabilirsiniz:

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

frame = frame.reindex(columns=columnsTitles)

6
Diğer çözümlerin çoğu daha özlü olsa da, bunu% 100 aşina olmayanlar için en okunaklı olarak düşünürdüm pandas.
Dirk

3
Dönüş değerini bir değişkene atamayı unutmayın, bu sütun sırasını yerinde değiştirmez (en azından pandasv0.23`te değil ).
Dirk

Teşekkürler @Dirk öneri için
Okroshiashvili

34

İşte çok sık kullandığım bir çözüm. Tonlarca sütun içeren büyük bir veri kümeniz olduğunda, kesinlikle tüm sütunları manuel olarak yeniden düzenlemek istemezsiniz.

Yapabileceğiniz ve büyük olasılıkla yapmak isteyeceğiniz şey, yalnızca sık kullandığınız ilk birkaç sütunu sıralamak ve diğer tüm sütunların kendileri olmasına izin vermektir. Bu, R.df %>%select(one, two, three, everything())

Böylece, önce sıralamak ve listedeki diğer tüm sütunların önüne yerleştirilmek istediğiniz sütunları manuel olarak yazabilirsiniz cols_to_order.

Ardından, sütunların geri kalanını birleştirerek yeni sütunlar için bir liste oluşturursunuz:

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

Bundan sonra, new_columnsönerilen diğer çözümleri kullanabilirsiniz .

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
mükemmel, mükemmel. her sütun adını veya dizini yazmak zorunda
stuart

Bu genel cevap ve kabul edilen cevap olmalı
CarlosH

26

Şunun gibi bir şey de yapabilirsin 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

Ayrıca, aşağıdaki sütunların listesini alabilirsiniz:

cols = list(df.columns.values)

Çıktı şuna benzer bir şey üretecek:

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

Daha sonra manuel olarak yeniden düzenlemek kolaydır.


13

Bir sözlük yerine bir listeyle oluşturun

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

'Sütun adı' alamadım: bir diktede olduğu gibi bir liste içinde çalışacak veriler.
Kim Miller

10

OrderedDict'i de kullanabilirsiniz:

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

"Sütunlar" parametresini ekleyin:

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

İndekslemeyi deneyin (böylece yalnızca bunun için genel bir çözüm istemezsiniz, böylece indeks sırası tam istediğiniz gibi olabilir):

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

Şimdi:

print(frame)

Dır-dir:

   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

Bunu en basit ve işe yarayan buluyorum:

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']]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.