DataFrame列の順序を変更するにはどうすればよいですか?


879

次のものがありますDataFramedf):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

割り当てによって列をさらに追加します。

df['mean'] = df.mean(1)

どうすれば列meanを前に移動できますか。つまり、他の列の順序を変更せずに最初の列として設定するにはどうすればよいですか?



1
一般化されたNumPyベースのソリューションについては、「パンダデータフレーム内の列を移動する方法」を参照してください。1つの列レベルのみを想定していMultiIndexます。
-jpp

回答:


853

簡単な方法の1つは、列のリストをデータフレームに再割り当てし、必要に応じて再配置することです。

これはあなたが今持っているものです:

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

cols好きなように並べ替えます。これは、最後の要素を最初の位置に移動する方法です。

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

次に、データフレームを次のように並べ替えます。

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399

17
「 'str'オブジェクトと 'list'オブジェクトを連結できない」場合、colsのstr値を[]してください:cols = [cols [7]] + cols [:7] + cols [8:]
moeabdol

3
@FooBarこれは集合和集合ではなく、2つの順序付きリストを連結したものです。
2016年

3
@アマン私はあなたのコードが廃止予定であることを指摘しています。投稿の処理は、あなたの裁量に任されています。
FooBar 2016年

2
@FooBar、タイプcolslist; 複製も可能です(データフレームで使用すると破棄されます)。あなたはIndexオブジェクトについて考えています。
アレクシス2017

8
これはすべてのデータをコピーすることを意味し、非常に非効率的です。私はパンダがコピーを作成せずにそれを行う方法を望んでいました。
Konstantin

442

次のようなこともできます:

df = df[['mean', '0', '1', '2', '3']]

あなたは列のリストを得ることができます:

cols = list(df.columns.values)

出力は以下を生成します:

['0', '1', '2', '3', 'mean']

...最初の関数にドロップする前に手動で再配置するのは簡単です


8
また、list(df.columns)で列のリストを取得することもできます
Jim

8
またはdf.columns.tolist()
Jim

私のような初心者の場合、colsから取得したリストを並べ替えます。次に、df = df [cols]つまり、再配置されたリストは、ブラケットのセットが1つもない最初の式にドロップされます。
シド

列名は、3.xでは整数になりますdf = df[['mean1', 0, 1, 2, 3]]
prosti

1
データフレームの列の順序を変更するコードを提供していないため、これは良い答えではないと思います。csvファイルをpandas pd asとしてインポートするとしますpd.read_csv()。回答をどのように使用して列の順序を変更できますか?
Robvh

312

必要な順序で列名を割り当てるだけです。

In [39]: df
Out[39]: 
          0         1         2         3         4  mean
0  0.172742  0.915661  0.043387  0.712833  0.190717     1
1  0.128186  0.424771  0.590779  0.771080  0.617472     1
2  0.125709  0.085894  0.989798  0.829491  0.155563     1
3  0.742578  0.104061  0.299708  0.616751  0.951802     1
4  0.721118  0.528156  0.421360  0.105886  0.322311     1
5  0.900878  0.082047  0.224656  0.195162  0.736652     1
6  0.897832  0.558108  0.318016  0.586563  0.507564     1
7  0.027178  0.375183  0.930248  0.921786  0.337060     1
8  0.763028  0.182905  0.931756  0.110675  0.423398     1
9  0.848996  0.310562  0.140873  0.304561  0.417808     1

In [40]: df = df[['mean', 4,3,2,1]]

これで、「平均」列が前面に表示されます。

In [41]: df
Out[41]: 
   mean         4         3         2         1
0     1  0.190717  0.712833  0.043387  0.915661
1     1  0.617472  0.771080  0.590779  0.424771
2     1  0.155563  0.829491  0.989798  0.085894
3     1  0.951802  0.616751  0.299708  0.104061
4     1  0.322311  0.105886  0.421360  0.528156
5     1  0.736652  0.195162  0.224656  0.082047
6     1  0.507564  0.586563  0.318016  0.558108
7     1  0.337060  0.921786  0.930248  0.375183
8     1  0.423398  0.110675  0.931756  0.182905
9     1  0.417808  0.304561  0.140873  0.310562

7
コピーしますか?
user3226167 2017年

21
@NicholasMorley-たとえば、dfに1000列ある場合、これは最良の答えではありません。
AGS

1
あなたが<df>.columns最初に主張するようにあなたが割り当てているようには見えない
ビョークはナンバーワンのファン'19

8
これは、列数が少ない場合の最良の答えです。
東急チェ

2
これは@freddygvの以前の回答の単なるコピーです。これは、これではなく、受け入れられる答えである必要があります。
James Hirschorn、2018年

134

35
これは将来的に追加される機能pandasでしょうか?のようなものdf.move(0,df.mean)
ジェイソン2014年

ああ、それもこのように動作しますdf_metadata.insert(0,'Db_name',"raw_data")(コードはこのスレッドには関係ありません)
Aetos

3
綺麗な。そしてそれはその場でも起こります。
cucu8 2018

2
他のソリューションが手動で列名を入力しているため、これはスケーラブルなソリューションです。
CKM

これは、新しい列を作成するときのOPの質問に対しては機能しますが、列を移動するためには機能しません。結果を移動しようとする*** ValueError: cannot insert mean, already exists
スピンアップ

122

あなたの場合、

df = df.reindex(columns=['mean',0,1,2,3,4])

あなたが望むことを正確に行います。

私の場合(一般的な形式):

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

2
設定しようとしましcopy=Falseたが、reindex_axisまだコピーが作成されているようです。
Konstantin

1
@Konstantinこの問題について別の質問を作成できますか?より多くのコンテキストを持つ方が良いでしょう
Alvaro Joao

57

列の新しいリストを目的の順序で作成し、を使用df = df[cols]してこの新しい順序で列を再配置する必要があります。

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

より一般的な方法を使用することもできます。この例では、最後の列(-1で示される)が最初の列として挿入されます。

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

列がDataFrameに存在する場合、このアプローチを使用して列を希望の順序に並べ替えることもできます。

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted_cols])
df = df[cols]

46
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names: 
    df[col] = np.random.randint(0,100, size=10000)

次の解決策を試すことができます。

解決策1:

df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]

解決策2:


df = df[['mean', 'x', 'y', 'z']]

解決策3:

col = df.pop("mean")
df = df.insert(0, col.name, col)

解決策4:

df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)

解決策5:

cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]

ソリューション6:

order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]

時間比較:

解決策1:

CPU時間:ユーザー1.05 ms、システム:35 µs、合計:1.08 msウォール時間:995 µs

ソリューション2

CPU時間:ユーザー933 µs、システム:0 ns、合計:933 µsウォールタイム:800 µs

ソリューション3

CPU時間:ユーザー0 ns、システム:1.35 ms、合計:1.35 msウォール時間:1.08 ms

ソリューション4

CPU時間:ユーザー1.23ミリ秒、システム:45マイクロ秒、合計:1.27ミリ秒ウォールタイム:986マイクロ秒

ソリューション5

CPU時間:ユーザー1.09 ms、システム:19 µs、合計:1.11 msウォール時間:949 µs

ソリューション6

CPU時間:ユーザー955 µs、システム:34 µs、合計:989 µsウォールタイム:859 µs


1
こんな素敵な答え、ありがとうございます。
qasimalbaqali

1
解決策1は、私があまりにも多くの列(53)、おかげで持っているとして、私は必要なものである
ratnesh

@Pygirlの値は実際の消費時間を示していますか?(ユーザー、システム、合計時間または実時間)
sergzemsk

1
これは私にとって問題の最良の答えです。非常に多くのソリューション(必要なものを含む)とシンプルなアプローチ。ありがとう!
グスタボロットゲーリング

1
解決策6(リスト内包表記なし):df = df.iloc[:, [1, 2, 3, 0]]
Dmitriy Work

43

2018年8月から:

列名が長すぎて入力できない場合は、位置と整数のリストを使用して新しい順序を指定できます。

データ:

          0         1         2         3         4      mean
0  0.397312  0.361846  0.719802  0.575223  0.449205  0.500678
1  0.287256  0.522337  0.992154  0.584221  0.042739  0.485741
2  0.884812  0.464172  0.149296  0.167698  0.793634  0.491923
3  0.656891  0.500179  0.046006  0.862769  0.651065  0.543382
4  0.673702  0.223489  0.438760  0.468954  0.308509  0.422683
5  0.764020  0.093050  0.100932  0.572475  0.416471  0.389390
6  0.259181  0.248186  0.626101  0.556980  0.559413  0.449972
7  0.400591  0.075461  0.096072  0.308755  0.157078  0.207592
8  0.639745  0.368987  0.340573  0.997547  0.011892  0.471749
9  0.050582  0.714160  0.168839  0.899230  0.359690  0.438500

一般的な例:

new_order = [3,2,1,4,5,0]
print(df[df.columns[new_order]])  

          3         2         1         4      mean         0
0  0.575223  0.719802  0.361846  0.449205  0.500678  0.397312
1  0.584221  0.992154  0.522337  0.042739  0.485741  0.287256
2  0.167698  0.149296  0.464172  0.793634  0.491923  0.884812
3  0.862769  0.046006  0.500179  0.651065  0.543382  0.656891
4  0.468954  0.438760  0.223489  0.308509  0.422683  0.673702
5  0.572475  0.100932  0.093050  0.416471  0.389390  0.764020
6  0.556980  0.626101  0.248186  0.559413  0.449972  0.259181
7  0.308755  0.096072  0.075461  0.157078  0.207592  0.400591
8  0.997547  0.340573  0.368987  0.011892  0.471749  0.639745
9  0.899230  0.168839  0.714160  0.359690  0.438500  0.050582

そしてOPの質問の特定のケースについて:

new_order = [-1,0,1,2,3,4]
df = df[df.columns[new_order]]
print(df)

       mean         0         1         2         3         4
0  0.500678  0.397312  0.361846  0.719802  0.575223  0.449205
1  0.485741  0.287256  0.522337  0.992154  0.584221  0.042739
2  0.491923  0.884812  0.464172  0.149296  0.167698  0.793634
3  0.543382  0.656891  0.500179  0.046006  0.862769  0.651065
4  0.422683  0.673702  0.223489  0.438760  0.468954  0.308509
5  0.389390  0.764020  0.093050  0.100932  0.572475  0.416471
6  0.449972  0.259181  0.248186  0.626101  0.556980  0.559413
7  0.207592  0.400591  0.075461  0.096072  0.308755  0.157078
8  0.471749  0.639745  0.368987  0.340573  0.997547  0.011892
9  0.438500  0.050582  0.714160  0.168839  0.899230  0.359690

このアプローチの主な問題は、同じコードを複数回呼び出すと毎回異なる結果が作成されるため、注意が必要です:)


17

この関数を使用すると、データセット内のすべての変数をリストして、それらのいくつかを順序付けるだけで済みます。

def order(frame,var):
    if type(var) is str:
        var = [var] #let the command take a string or list
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 

これは2つの引数を取ります。1つ目はデータセット、2つ目は前面に表示するデータセットの列です。

したがって、私の場合、変数A1、A2、B1、B2、合計、日付を含むFrameというデータセットがあります。Totalを前面に表示したい場合は、次のことを行うだけです。

frame = order(frame,['Total'])

TotalとDateを前面に表示したい場合は、次のようにします。

frame = order(frame,['Total','Date'])

編集:

これを使用するもう1つの便利な方法は、見慣れないテーブルがあり、VAR1、VAR2などの特定の用語が含まれている変数を探している場合です。次のように実行できます。

frame = order(frame,[v for v in frame.columns if "VAR" in v])

17

私も似たような質問に出くわし、解決したことを追加したかっただけです。reindex_axis() method列の順序を変更できる点が気に入りました。これはうまくいきました:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

@Jorgeからのコメントに基づく別の方法:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

reindex_axisよりマイクロベンチマークでは若干速くなるようだreindex、私はその直接性のために、後者を好むと思います。


6
これは良い解決策でしたが、reindex_axisは廃止される予定です。私はreindexを使用しましたが、うまくいきました。
ホルヘ

15

単純に、

df = df[['mean'] + df.columns[:-1].tolist()]

TypeError: 'int'オブジェクトをstrに暗黙的に変換できません
parvij

APIが変更された可能性があります。これを行うこともできます... order = df.columns.tolist() df['mean'] = df.mean(1) df.columns = ['mean'] + order
Napitupulu Jon

1
これのバリエーションは私にはうまくいきました。既存のリストheadersを使用して、それはdictを作成するために使用され、次にそれを使用してDataFrameを作成しましたdf.reindex(columns=headers)。私が遭遇した唯一の問題は、すでにを呼び出していたdf.set_index('some header name', inplace=True)ためsome header name、インデックスの再作成が行われたときに、元の列がインデックスになっているため、別の列が追加されました。上記で指定された構文に関して['mean'] + df.columnsは、Pythonインタープリターで私に与えますIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
hlongmore

1
@hlongmore:以前のコードはわかりませんが、編集は機能するはずです(0.19.2を使用)
Napitupulu Jon

編集は確かに機能します(私は0.20.2を使用しています)。私の場合、必要な列が既にあるので、df.reindex()を実際に使用する必要があると思います。
hlongmore 2017年

11

あなたは次のことをすることができます(アマンの答えから一部を借りる):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

10

変更する列名を入力し、新しい場所のインデックスを設定するだけです。

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

あなたの場合、これは次のようになります:

df = change_column_order(df, 'mean', 0)

これは過小評価されています
zelusp

8

列を任意の位置に移動する:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3], 
                   "B": [2,4,8], 
                   "C": [5,5,5]})

cols = df.columns.tolist()
column_to_move = "C"
new_position = 1

cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]

7

これは少しきちんとした解決策だと思います:

df.insert(0,'mean', df.pop("mean"))

このソリューションは@JoeHefferのソリューションにいくぶん似ていますが、これは1つのライナーです。

ここでは"mean"、データフレームから列を削除0し、同じ列名でインデックスにアタッチします。


5

これは、既存のデータフレームを変更する1つの既存の列を移動する方法です。

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)

5

この質問は回答されている前に、私が使用することをお勧めしますので、廃止されreindex_axis:

df.reindex(sorted(df.columns), axis=1)

19
いいえ、違います。そこで、ユーザーはすべての列を名前でソートしたいと考えています。ここでは、他の列の順序を変更せずに、1つの列を最初の列に移動したいと考えています。
smci 2013

1
それらをソートしたくない場合はどうなりますか?
Chankey Pathak 2017

これはコピーを返しますが、インプレースでは機能しません
スピンアップ

3

「T」の使い方は?

df.T.reindex(['mean',0,1,2,3,4]).T

3

@clocker:2つの列を前にピボットステートメントから生成されているため、すべての列の名前が正確にわからないデータフレームから2つの列を前面に持ちたかったので、あなたのソリューションは非常に役に立ちました。したがって、同じ状況にある場合:名前がわかっている列を前面に表示し、その後に「他のすべての列」が続くようにするには、次の一般的な解決策を考え出しました。

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)

3

set()

簡単なアプローチはset()、特に列の長いリストがあり、それらを手動で処理したくない場合にを使用することです。

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]

2
注意点:列をセットに入れると列の順序がなくなります
pvarma

面白い!@ user1930402私は上記の方法を何度か試しましたが、問題はありませんでした。もう一度確認します。
Shoresh 2018年

2

位置がわからないときにset機能を使用して列を削除するというShoreshの回答が好きでしたが、元の列の順序(任意の列ラベルがある)を維持する必要があるため、これは私の目的には機能しませんでした。

私も使って仕事にこれを得たIndexedSetをボルトンズパッケージから。

また、複数の列ラベルを再度追加する必要があったため、より一般的なケースでは次のコードを使用しました。

from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]

これが一般的な解決策のためにこのスレッドを検索している誰にとっても役立つことを願っています。


ちょっとビックリ!私setはこの目的のために非常に頻繁に使用し、注文に対処する必要はありませんでした。
Shoresh

2

あなたは使用することができreindex、両方の軸のために使用することができます。

df
#           0         1         2         3         4      mean
# 0  0.943825  0.202490  0.071908  0.452985  0.678397  0.469921
# 1  0.745569  0.103029  0.268984  0.663710  0.037813  0.363821
# 2  0.693016  0.621525  0.031589  0.956703  0.118434  0.484254
# 3  0.284922  0.527293  0.791596  0.243768  0.629102  0.495336
# 4  0.354870  0.113014  0.326395  0.656415  0.172445  0.324628
# 5  0.815584  0.532382  0.195437  0.829670  0.019001  0.478415
# 6  0.944587  0.068690  0.811771  0.006846  0.698785  0.506136
# 7  0.595077  0.437571  0.023520  0.772187  0.862554  0.538182
# 8  0.700771  0.413958  0.097996  0.355228  0.656919  0.444974
# 9  0.263138  0.906283  0.121386  0.624336  0.859904  0.555009

df.reindex(['mean', *range(5)], axis=1)

#        mean         0         1         2         3         4
# 0  0.469921  0.943825  0.202490  0.071908  0.452985  0.678397
# 1  0.363821  0.745569  0.103029  0.268984  0.663710  0.037813
# 2  0.484254  0.693016  0.621525  0.031589  0.956703  0.118434
# 3  0.495336  0.284922  0.527293  0.791596  0.243768  0.629102
# 4  0.324628  0.354870  0.113014  0.326395  0.656415  0.172445
# 5  0.478415  0.815584  0.532382  0.195437  0.829670  0.019001
# 6  0.506136  0.944587  0.068690  0.811771  0.006846  0.698785
# 7  0.538182  0.595077  0.437571  0.023520  0.772187  0.862554
# 8  0.444974  0.700771  0.413958  0.097996  0.355228  0.656919
# 9  0.555009  0.263138  0.906283  0.121386  0.624336  0.859904

2

これは、任意の数の列に対してこれを行う関数です。

def mean_first(df):
    ncols = df.shape[1]        # Get the number of columns
    index = list(range(ncols)) # Create an index to reorder the columns
    index.insert(0,ncols)      # This puts the last column at the front
    return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first

2

本の中で最もハッキリした方法

df.insert(0,"test",df["mean"])
df=df.drop(columns=["mean"]).rename(columns={"test":"mean"})

2

この機能はもっと簡単だと思います。列のサブセットを開始または終了、あるいはその両方で指定する必要があるだけです。

def reorder_df_columns(df, start=None, end=None):
    """
        This function reorder columns of a DataFrame.
        It takes columns given in the list `start` and move them to the left.
        Its also takes columns in `end` and move them to the right.
    """
    if start is None:
        start = []
    if end is None:
        end = []
    assert isinstance(start, list) and isinstance(end, list)
    cols = list(df.columns)
    for c in start:
        if c not in cols:
            start.remove(c)
    for c in end:
        if c not in cols or c in start:
            end.remove(c)
    for c in start + end:
        cols.remove(c)
    cols = start + cols + end
    return df[cols]

1

私は信じているアマンの答えは@あなたが他の列の場所を知っていれば最高です。

の場所がわからずmean、その名前しかわからない場合は、直接に頼ることはできませんcols = cols[-1:] + cols[:-1]。以下は私が思いつくことができる次善のものです:

meanDf = pd.DataFrame(df.pop('mean'))
# now df doesn't contain "mean" anymore. Order of join will move it to left or right:
meanDf.join(df) # has mean as first column
df.join(meanDf) # has mean as last column

1

ひっくり返すだけでよく役に立ちます。

df[df.columns[::-1]]

または、シャッフルして見てください。

import random
cols = list(df.columns)
random.shuffle(cols)
df[cols]

0

答えのほとんどは十分に一般化されておらず、パンダのreindex_axisメソッドは少し面倒なので、キー=列名と値=移動先のディクショナリを使用して、任意の数の列を任意の位置に移動する簡単な関数を提供します。データフレームが大きい場合、Trueを 'big_data'に渡し、関数は順序付けされた列のリストを返します。そして、このリストを使用してデータをスライスできます。

def order_column(df, columns, big_data = False):

    """Re-Orders dataFrame column(s)
       Parameters : 
       df      -- dataframe
       columns -- a dictionary:
                  key   = current column position/index or column name
                  value = position to move it to  
       big_data -- boolean 
                  True = returns only the ordered columns as a list
                          the user user can then slice the data using this
                          ordered column
                  False = default - return a copy of the dataframe
    """
    ordered_col = df.columns.tolist()

    for key, value in columns.items():

        ordered_col.remove(key)
        ordered_col.insert(value, key)

    if big_data:

        return ordered_col

    return df[ordered_col]

# e.g.
df = pd.DataFrame({'chicken wings': np.random.rand(10, 1).flatten(), 'taco': np.random.rand(10,1).flatten(),
                          'coffee': np.random.rand(10, 1).flatten()})
df['mean'] = df.mean(1)

df = order_column(df, {'mean': 0, 'coffee':1 })

>>>

出力

col = order_column(df, {'mean': 0, 'coffee':1 }, True)

col
>>>
['mean', 'coffee', 'chicken wings', 'taco']

# you could grab it by doing this

df = df[col]

0

パンダの列名を並べ替える非常に特殊な使用例があります。時々、既存の列に基づくデータフレームに新しい列を作成しています。デフォルトでは、パンダは新しい列を最後に挿入しますが、派生元の既存の列の横に新しい列を挿入します。

ここに画像の説明を入力してください

def rearrange_list(input_list, input_item_to_move, input_item_insert_here):
    '''
    Helper function to re-arrange the order of items in a list.
    Useful for moving column in pandas dataframe.

    Inputs:
        input_list - list
        input_item_to_move - item in list to move
        input_item_insert_here - item in list, insert before 

    returns:
        output_list
    '''
    # make copy for output, make sure it's a list
    output_list = list(input_list)

    # index of item to move
    idx_move = output_list.index(input_item_to_move)

    # pop off the item to move
    itm_move = output_list.pop(idx_move)

    # index of item to insert here
    idx_insert = output_list.index(input_item_insert_here)

    # insert item to move into here
    output_list.insert(idx_insert, itm_move)

    return output_list


import pandas as pd

# step 1: create sample dataframe
df = pd.DataFrame({
    'motorcycle': ['motorcycle1', 'motorcycle2', 'motorcycle3'],
    'initial_odometer': [101, 500, 322],
    'final_odometer': [201, 515, 463],
    'other_col_1': ['blah', 'blah', 'blah'],
    'other_col_2': ['blah', 'blah', 'blah']
})
print('Step 1: create sample dataframe')
display(df)
print()

# step 2: add new column that is difference between final and initial
df['change_odometer'] = df['final_odometer']-df['initial_odometer']
print('Step 2: add new column')
display(df)
print()

# step 3: rearrange columns
ls_cols = df.columns
ls_cols = rearrange_list(ls_cols, 'change_odometer', 'final_odometer')
df=df[ls_cols]
print('Step 3: rearrange columns')
display(df)

0

私にとってうまくいったかなり簡単な解決策は、df.columnsで.reindexを使用することです。

df=df[df.columns.reindex(['mean',0,1,2,3,4])[0]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.