私は次の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
必要な順序で列名を割り当てるだけです。
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
パンダ >= 1.3 の場合 (2022 年に編集):
df.insert(0, 'mean', df.pop('mean'))
どうですか(パンダ<1.3の場合、元の回答)
df.insert(0, 'mean', df['mean'])
あなたの場合、
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']) ))
列名が長すぎて入力できない場合は、位置を含む整数のリストを使用して新しい順序を指定できます。
データ:
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
列名を別の順序で明示的に入力しているように見えるかもしれませんが、列「平均」があるという事実は、列名ではnew_order
なく実際の位置に関連することを明確にするはずです。
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
このアプローチの主な問題は、同じコードを複数回呼び出すと毎回異なる結果が生成されることです。そのため、注意が必要です:)
この質問は以前に回答されましたが、reindex_axis
現在は非推奨になっているため、次を使用することをお勧めします。
df = df.reindex(sorted(df.columns), axis=1)
単に並べ替えるのではなく、必要な順序を指定したい場合は、次の解決策が詳しく説明されています。
df = df.reindex(['the','order','you','want'], axis=1)
さて、列名のリストをどのように並べ替えるかはpandas
問題ではなく、Python のリスト操作の問題です。それには多くの方法がありますが、この答えには非常にきちんとした方法があると思います。
この関数を使用すると、データセット内の変数をいくつか並べ替えるために、すべての変数を一覧表示する必要がなくなります。
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、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])
次の名前のリストを使用して、データフレーム列を並べ替えることができます。
df = df.filter(list_of_col_names)
単純に、
df = df[['mean'] + df.columns[:-1].tolist()]
変更する列名を入力し、新しい場所のインデックスを設定するだけです。
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)
を使用してはT
どうですか?
df = df.T.reindex(['mean', 0, 1, 2, 3, 4]).T
他の列の場所がわかっている場合は、@ 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
パンダで列名を並べ替えるための非常に具体的なユースケースがあります。既存の列に基づくデータフレームに新しい列を作成することがあります。デフォルトでは、パンダは新しい列を最後に挿入しますが、新しい列を派生元の既存の列の隣に挿入したいと思います。
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)
これを行うための非常に簡単な方法の例を次に示します。Excel の使用からヘッダーをコピーする場合.split('\t')
df = df['FILE_NAME DISPLAY_PATH SHAREPOINT_PATH RETAILER LAST_UPDATE'.split()]
この機能の方がわかりやすいと思います。最初または最後、またはその両方で列のサブセットを指定するだけです。
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]
並べ替えは、正しい順序が維持されることを保証しません。['mean'] を列リストと連結すると、それになります。
cols_list = ['mean'] + df.columns.tolist()
df['mean'] = df.mean(1)
df = df[cols_list]