パンダデータフレームの列の順序を設定する


103

私の個人的な好みに基づいてパンダデータフレームの列を並べ替える方法はありますか(つまり、アルファベット順または数値順ではなく、特定の規則に従うような方法)?

簡単な例:

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

(このケースに固有のものではなく、一般的な解決策を提供してください。感謝します。)

回答:


156

列名を入力して注文を選択するだけです。二重括弧に注意してください:

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

24
これは、このかなり小さな例でのみ機能します。csvファイルやデータベーステーブルなど、別のソースからデータを読み込んでいる場合、この回答は使用できません。そして、それらははるかに一般的であるようです。OPは一般的なソリューションを要求しました。
chrisfs '07 / 07/23

83

あなたはこれを使うことができます:

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

frame = frame.reindex(columns=columnsTitles)

5
他のほとんどのソリューションはより簡潔ですが、これは100%に精通していない人にとっては最も読みやすいものだと思いpandasます。
ディルク

3
ただし、戻り値を変数に割り当てることを忘れないでください。これにより、列の順序は変更されません(少なくともpandasv0.23 では変更されません)。
Dirk

提案をありがとう@Dirk
Okroshiashvili

33

これは私が頻繁に使用するソリューションです。大量の列を含む大規模なデータセットがある場合、すべての列を手動で再配置したくありません。

あなたができること、そして最も可能性が高いことは、頻繁に使用する最初のいくつかの列を並べ替え、他のすべての列はそのままにすることです。これはRの一般的なアプローチです。df %>%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

「列名」を取得できませんでした。dictと同じように、リスト内で機能するデータです。
キム・ミラー

10

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

'columns'パラメータを追加します。

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.