私はDataFrame
(df
)を持っています。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.Rand(10, 5))
割り当てによって列を追加します。
df['mean'] = df.mean(1)
どうやって列mean
を最前面に移動させることができますか。すなわち、それを最初の列として設定して他の列の順序をそのままにします。
簡単な方法の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
次のようなこともできます。
df = df[['mean', '0', '1', '2', '3']]
列のリストは次のようにして取得できます。
cols = list(df.columns.values)
出力は次のようになります。
['0', '1', '2', '3', 'mean']
...最初の関数に入れる前に手動で並べ替えるのは簡単です
必要な順番で列名を割り当てるだけです。
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
どうですか?
df.insert(0, 'mean', df.mean(1))
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
あなたの場合は、
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)
reindex
を使いたい場合:
df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))
列名が長すぎて入力できない場合は、次の位置を持つ整数のリストを使って新しい順序を指定できます。
データ:
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
このアプローチの主な問題は、同じコードを複数回呼び出すと毎回異なる結果が出ることです。そのため、注意が必要です:)
あなたはあなたが望む順番であなたのカラムの新しいリストを作成する必要がありますそしてそれからこの新しい順番でカラムを並べ替えるために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]
簡単に
df = df[['mean'] + df.columns[:-1].tolist()]
私は自分自身に似たような質問に出くわし、そして私が解決したものを加えたいだけでした。列の順序を変更するための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
よりもマイクロベンチマークの方がわずかに速いようですが、その直接的さのために私は後者を好むと思います。
この機能を使用すると、データセット内のすべての変数を一覧表示する必要がなくなります。
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])
あなたは次のことを行うことができます(アマンの答えから一部を借りる)。
cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))
cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]
df = df[cols]
変更したい列名を入力して、新しい場所のインデックスを設定するだけです。
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)
任意の列を任意の位置に移動する:
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]
最も簡単な方法は、このように列名の順序を変更することです。
df = df[['mean', Col1,Col2,Col3]]
この質問は答えられました 前
df.reindex(sorted(df.columns), axis=1)
set()
:
簡単な方法は、set()
を使用することです。特に、長い列リストがあり、それらを手動で処理したくない場合は、
cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]
これは、既存のデータフレームを変更する既存の列を1つ移動する方法です。
my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)
"T"を使ってはどうですか?
df.T.reindex(['mean',0,1,2,3,4]).T
Wes McKinneyによって提案されたように、私はinsert()
関数を試しました。
df.insert(0、 'mean'、df.mean(1))
これで、Timmieが望んだ結果が1行で、最後の列を移動する必要なしに得られました。
@clocker:すべての列の名前が正確にわからないデータフレームの前に2つの列を配置したいので、このソリューションは非常に役に立ちました。これらの列はピボットステートメントから生成されたものだからです。それで、あなたが同じ状況にいるならば:あなたが名前を知っていることの前に列を持って来てそしてそれから「他のすべての列」を続けさせるために、私は次の一般的な解決策を思いつきました。
df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)
両方の軸に使用できる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
これは任意の数の列に対してこれを行う関数です。
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
DataFrame.sort_index(axis=1)
はとてもきれいです。 こちらのドキュメントをチェックしてください 。そしてconcat
本の中で最もハッキングな方法
df.insert(0,"test",df["mean"])
df=df.drop(columns=["mean"]).rename(columns={"test":"mean"})
私は @ 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
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]
これが一般的な解決策のためにこのスレッドを検索する人にとって有用であることを願っています。