web-dev-qa-db-ja.com

DataFrame列の順序を変更する方法

私はDataFramedf)を持っています。

import numpy as np
import pandas as pd

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

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

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

どうやって列meanを最前面に移動させることができますか。すなわち、それを最初の列として設定して他の列の順序をそのままにします。

593
Timmie

簡単な方法の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
632
Aman

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

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

列のリストは次のようにして取得できます。

cols = list(df.columns.values)

出力は次のようになります。

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

...最初の関数に入れる前に手動で並べ替えるのは簡単です

293
freddygv

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

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]]

さて、 'mean'列が前面に出ています。

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
254
fixxxer
105
Wes McKinney

あなたの場合は、

df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)

まさにあなたが望むことをするでしょう。

私の場合(一般形):

df = df.reindex_axis(sorted(df.columns), axis=1)
df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)

2018年1月に更新

reindexを使いたい場合:

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

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

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

27
Yuca

あなたはあなたが望む順番であなたのカラムの新しいリストを作成する必要がありますそしてそれからこの新しい順番でカラムを並べ替えるために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]
24
Alexander

簡単に

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

私は自分自身に似たような質問に出くわし、そして私が解決したものを加えたいだけでした。列の順序を変更するための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_axisreindexよりもマイクロベンチマークの方がわずかに速いようですが、その直接的さのために私は後者を好むと思います。

14
clocker

この機能を使用すると、データセット内のすべての変数を一覧表示する必要がなくなります。

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つの引数を取ります。最初の引数はデータセット、2番目の引数はデータセット内の最前面に表示する列です。

したがって、私の場合は、変数A1、A2、B1、B2、Total、およびDateを持つ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])
13
seeiespi

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

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

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

df = df[cols]
8
otteheng

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

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

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

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
pomber

最も簡単な方法は、このように列名の順序を変更することです。

df = df[['mean', Col1,Col2,Col3]]

6
Gayatri

この質問は答えられました

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

set()

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

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

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

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

"T"を使ってはどうですか?

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

Wes McKinneyによって提案されたように、私はinsert()関数を試しました。

df.insert(0、 'mean'、df.mean(1))

これで、Timmieが望んだ結果が1行で、最後の列を移動する必要なしに得られました。

3
Gan William

@clocker:すべての列の名前が正確にわからないデータフレームの前に2つの列を配置したいので、このソリューションは非常に役に立ちました。これらの列はピボットステートメントから生成されたものだからです。それで、あなたが同じ状況にいるならば:あなたが名前を知っていることの前に列を持って来てそしてそれから「他のすべての列」を続けさせるために、私は次の一般的な解決策を思いつきました。

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

両方の軸に使用できる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
silgon

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

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
freeB

DataFrame.sort_index(axis=1)はとてもきれいです。 こちらのドキュメントをチェックしてください 。そしてconcat

1
Shihe Zhang

本の中で最もハッキングな方法

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

私は @ Amanの答えを信じています あなたが他のコラムの位置を知っていれば/は最高です。

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
FooBar

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

Boltonsパッケージの IndexedSet を使っても動作するようになりました。

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

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

これが一般的な解決策のためにこのスレッドを検索する人にとって有用であることを願っています。

1
Jamelade