次のものがありますDataFrame
(df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
割り当てによって列をさらに追加します。
df['mean'] = df.mean(1)
どうすれば列mean
を前に移動できますか。つまり、他の列の順序を変更せずに最初の列として設定するにはどうすればよいですか?
MultiIndex
ます。
次のものがありますDataFrame
(df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
割り当てによって列をさらに追加します。
df['mean'] = df.mean(1)
どうすれば列mean
を前に移動できますか。つまり、他の列の順序を変更せずに最初の列として設定するにはどうすればよいですか?
MultiIndex
ます。
回答:
簡単な方法の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
cols
はlist
; 複製も可能です(データフレームで使用すると破棄されます)。あなたはIndex
オブジェクトについて考えています。
次のようなこともできます:
df = df[['mean', '0', '1', '2', '3']]
あなたは列のリストを得ることができます:
cols = list(df.columns.values)
出力は以下を生成します:
['0', '1', '2', '3', 'mean']
...最初の関数にドロップする前に手動で再配置するのは簡単です
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
✓
pd.read_csv()
。回答をどのように使用して列の順序を変更できますか?
必要な順序で列名を割り当てるだけです。
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
<df>.columns
最初に主張するようにあなたが割り当てているようには見えない
どうですか:
df.insert(0, 'mean', df.mean(1))
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
pandas
でしょうか?のようなものdf.move(0,df.mean)
?
df_metadata.insert(0,'Db_name',"raw_data")
(コードはこのスレッドには関係ありません)
*** ValueError: cannot insert mean, already exists
あなたの場合、
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']) ))
copy=False
たが、reindex_axis
まだコピーが作成されているようです。
列の新しいリストを目的の順序で作成し、を使用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]
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names:
df[col] = np.random.randint(0,100, size=10000)
次の解決策を試すことができます。
解決策1:
df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]
解決策2:
df = df[['mean', 'x', 'y', 'z']]
解決策3:
col = df.pop("mean")
df = df.insert(0, col.name, col)
解決策4:
df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)
解決策5:
cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]
ソリューション6:
order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]
解決策1:
CPU時間:ユーザー1.05 ms、システム:35 µs、合計:1.08 msウォール時間:995 µs
ソリューション2:
CPU時間:ユーザー933 µs、システム:0 ns、合計:933 µsウォールタイム:800 µs
ソリューション3:
CPU時間:ユーザー0 ns、システム:1.35 ms、合計:1.35 msウォール時間:1.08 ms
ソリューション4:
CPU時間:ユーザー1.23ミリ秒、システム:45マイクロ秒、合計:1.27ミリ秒ウォールタイム:986マイクロ秒
ソリューション5:
CPU時間:ユーザー1.09 ms、システム:19 µs、合計:1.11 msウォール時間:949 µs
ソリューション6:
CPU時間:ユーザー955 µs、システム:34 µs、合計:989 µsウォールタイム:859 µs
df = df.iloc[:, [1, 2, 3, 0]]
列名が長すぎて入力できない場合は、位置と整数のリストを使用して新しい順序を指定できます。
データ:
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
このアプローチの主な問題は、同じコードを複数回呼び出すと毎回異なる結果が作成されるため、注意が必要です:)
この関数を使用すると、データセット内のすべての変数をリストして、それらのいくつかを順序付けるだけで済みます。
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、合計、日付を含む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])
私も似たような質問に出くわし、解決したことを追加したかっただけです。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
、私はその直接性のために、後者を好むと思います。
単純に、
df = df[['mean'] + df.columns[:-1].tolist()]
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
を使用して、それはdictを作成するために使用され、次にそれを使用してDataFrameを作成しましたdf.reindex(columns=headers)
。私が遭遇した唯一の問題は、すでにを呼び出していたdf.set_index('some header name', inplace=True)
ためsome header name
、インデックスの再作成が行われたときに、元の列がインデックスになっているため、別の列が追加されました。上記で指定された構文に関して['mean'] + df.columns
は、Pythonインタープリターで私に与えますIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
set()
:
簡単なアプローチはset()
、特に列の長いリストがあり、それらを手動で処理したくない場合にを使用することです。
cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]
位置がわからないときにset機能を使用して列を削除するというShoreshの回答が好きでしたが、元の列の順序(任意の列ラベルがある)を維持する必要があるため、これは私の目的には機能しませんでした。
私も使って仕事にこれを得たIndexedSetをボルトンズパッケージから。
また、複数の列ラベルを再度追加する必要があったため、より一般的なケースでは次のコードを使用しました。
from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]
これが一般的な解決策のためにこのスレッドを検索している誰にとっても役立つことを願っています。
set
はこの目的のために非常に頻繁に使用し、注文に対処する必要はありませんでした。
あなたは使用することができ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
この機能はもっと簡単だと思います。列のサブセットを開始または終了、あるいはその両方で指定する必要があるだけです。
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 = 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
答えのほとんどは十分に一般化されておらず、パンダのreindex_axisメソッドは少し面倒なので、キー=列名と値=移動先のディクショナリを使用して、任意の数の列を任意の位置に移動する簡単な関数を提供します。データフレームが大きい場合、Trueを 'big_data'に渡し、関数は順序付けされた列のリストを返します。そして、このリストを使用してデータをスライスできます。
def order_column(df, columns, big_data = False):
"""Re-Orders dataFrame column(s)
Parameters :
df -- dataframe
columns -- a dictionary:
key = current column position/index or column name
value = position to move it to
big_data -- boolean
True = returns only the ordered columns as a list
the user user can then slice the data using this
ordered column
False = default - return a copy of the dataframe
"""
ordered_col = df.columns.tolist()
for key, value in columns.items():
ordered_col.remove(key)
ordered_col.insert(value, key)
if big_data:
return ordered_col
return df[ordered_col]
# e.g.
df = pd.DataFrame({'chicken wings': np.random.rand(10, 1).flatten(), 'taco': np.random.rand(10,1).flatten(),
'coffee': np.random.rand(10, 1).flatten()})
df['mean'] = df.mean(1)
df = order_column(df, {'mean': 0, 'coffee':1 })
>>>
col = order_column(df, {'mean': 0, 'coffee':1 }, True)
col
>>>
['mean', 'coffee', 'chicken wings', 'taco']
# you could grab it by doing this
df = df[col]
パンダの列名を並べ替える非常に特殊な使用例があります。時々、既存の列に基づくデータフレームに新しい列を作成しています。デフォルトでは、パンダは新しい列を最後に挿入しますが、派生元の既存の列の横に新しい列を挿入します。
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)