web-dev-qa-db-ja.com

pandasで名前の列をテーブルの前に移動します

ここに私のdfがあります:

                             Net   Upper   Lower  Mid  Zsore
Answer option                                                
More than once a day          0%   0.22%  -0.12%   2    65 
Once a day                    0%   0.32%  -0.19%   3    45
Several times a week          2%   2.45%   1.10%   4    78
Once a week                   1%   1.63%  -0.40%   6    65

名前( "Mid")で列をテーブルの先頭、インデックス0に移動するにはどうすればよいですか。これは次のように見える必要があります。

                             Mid   Upper   Lower  Net  Zsore
Answer option                                                
More than once a day          2   0.22%  -0.12%   0%    65 
Once a day                    3   0.32%  -0.19%   0%    45
Several times a week          4   2.45%   1.10%   2%    78
Once a week                   6   1.63%  -0.40%   1%    65

私の現在のコードは、「df.columns.tolist()」を介してインデックスで列を移動しますが、名前でシフトしたいと思います。

55
Boosted_d16

リストを渡すことで、ixを使用して並べ替えることができます。

In [27]:
# get a list of columns
cols = list(df)
# move the column to head of list using index, pop and insert
cols.insert(0, cols.pop(cols.index('Mid')))
cols
Out[27]:
['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
In [28]:
# use ix to reorder
df = df.ix[:, cols]
df
Out[28]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

もう1つの方法は、列への参照を取得し、先頭に再挿入することです。

In [39]:
mid = df['Mid']
df.drop(labels=['Mid'], axis=1,inplace = True)
df.insert(0, 'Mid', mid)
df
Out[39]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

locを使用してixをpandas from 0.20.0 以降:

df = df.loc[:, cols]
76
EdChum

パンダではdf.reindex()関数を使用できます。 dfは

_                      Net  Upper   Lower  Mid  Zsore
Answer option                                      
More than once a day  0%  0.22%  -0.12%    2     65
Once a day            0%  0.32%  -0.19%    3     45
Several times a week  2%  2.45%   1.10%    4     78
Once a week           1%  1.63%  -0.40%    6     65
_

列名のリストを定義する

_cols = df.columns.tolist()
cols
Out[13]: ['Net', 'Upper', 'Lower', 'Mid', 'Zsore']
_

列名を好きな場所に移動します

_cols.insert(0, cols.pop(cols.index('Mid')))
cols
Out[16]: ['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
_

次に、df.reindex()関数を使用して並べ替えます

_df = df.reindex(columns= cols)
_

出力は:df

_                      Mid  Upper   Lower Net  Zsore
Answer option                                      
More than once a day    2  0.22%  -0.12%  0%     65
Once a day              3  0.32%  -0.19%  0%     45
Several times a week    4  2.45%   1.10%  2%     78
Once a week             6  1.63%  -0.40%  1%     65
_
30
Sachinmm

他のソリューションで他のすべての列を明示的に指定する方法が気に入らなかったので、これが私にとって最適に機能しました。大きなデータフレームでは遅いかもしれませんが...?

df = df.set_index('Mid').reset_index()

14
citynorman

たぶん私は何かを見逃していますが、これらの答えの多くは過度に複雑に思えます。単一のリスト内で列を設定することができるはずです:

前の列:

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

または、代わりに、それを後ろに移動したい場合:

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

または、複数の列を移動する場合:

cols_to_move = ['Mid', 'Zsore']
df           = df[ cols_to_move + [ col for col in df.columns if col not in cols_to_move ] ]
8
elPastor

これは、列の位置を再配置するために頻繁に使用する一般的なコードのセットです。役に立つかもしれません。

cols = df.columns.tolist()
n = int(cols.index('Mid'))
cols = [cols[n]] + cols[:n] + cols[n+1:]
df = df[cols]
7
Bhagabat Behera

データフレームの行の順序を変更するには、次のリストを使用します。

df = df[['Mid', 'Net', 'Upper', 'Lower', 'Zsore']]

これにより、後でコードを読むときに何が行われたかが非常に明確になります。また使用する:

df.columns
Out[1]: Index(['Net', 'Upper', 'Lower', 'Mid', 'Zsore'], dtype='object')

次に、カットアンドペーストして並べ替えます。

2