1304

私は次のDataFramedf)を持っています:

import numpy as np
import pandas as pd

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

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

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

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

4

42 に答える 42

1161

簡単な方法の 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
于 2012-10-30T22:38:49.910 に答える
372

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

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
于 2015-04-28T14:19:49.323 に答える
215

パンダ >= 1.3 の場合 (2022 年に編集):

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

どうですか(パンダ<1.3の場合、元の回答)

df.insert(0, 'mean', df['mean'])

https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.html#column-selection-addition-deletion

于 2012-11-09T21:04:03.803 に答える
178

あなたの場合、

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']) ))
于 2016-08-30T21:57:36.780 に答える
58

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

データ:

          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

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

于 2018-08-20T17:35:46.743 に答える
48

この質問は以前に回答されましが、reindex_axis現在は非推奨になっているため、次を使用することをお勧めします。

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

単に並べ替えるのではなく、必要な順序を指定したい場合は、次の解決策が詳しく説明されています。

df = df.reindex(['the','order','you','want'], axis=1)

さて、列名のリストをどのように並べ替えるかはpandas問題ではなく、Python のリスト操作の問題です。それには多くの方法がありますが、この答えには非常にきちんとした方法があると思います。

于 2013-01-04T06:04:46.777 に答える
19

この関数を使用すると、データセット内の変数をいくつか並べ替えるために、すべての変数を一覧表示する必要がなくなります。

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])
于 2014-07-29T19:30:18.293 に答える
18

次の名前のリストを使用して、データフレーム列を並べ替えることができます。

df = df.filter(list_of_col_names)

于 2021-04-13T13:36:15.773 に答える
17

単純に、

df = df[['mean'] + df.columns[:-1].tolist()]
于 2015-04-28T09:50:19.167 に答える
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)
于 2016-05-06T11:39:33.950 に答える
3

を使用してはTどうですか?

df = df.T.reindex(['mean', 0, 1, 2, 3, 4]).T
于 2016-06-26T23:46:28.867 に答える
2

他の列の場所がわかっている場合は、@ 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
于 2015-03-22T14:43:03.000 に答える
1

パンダで列名を並べ替えるための非常に具体的なユースケースがあります。既存の列に基づくデータフレームに新しい列を作成することがあります。デフォルトでは、パンダは新しい列を最後に挿入しますが、新しい列を派生元の既存の列の隣に挿入したいと思います。

ここに画像の説明を入力

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)
于 2019-12-11T23:42:04.333 に答える
1

これを行うための非常に簡単な方法の例を次に示します。Excel の使用からヘッダーをコピーする場合.split('\t')

df = df['FILE_NAME DISPLAY_PATH SHAREPOINT_PATH RETAILER LAST_UPDATE'.split()]
于 2021-11-06T04:42:23.123 に答える
1

この機能の方がわかりやすいと思います。最初または最後、またはその両方で列のサブセットを指定するだけです。

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]
于 2020-03-26T16:32:57.120 に答える
1

並べ替えは、正しい順序が維持されることを保証しません。['mean'] を列リストと連結すると、それになります。

cols_list = ['mean'] + df.columns.tolist()
df['mean'] = df.mean(1)
df = df[cols_list]
于 2021-12-08T14:05:16.537 に答える