如何改变DataFrame列的顺序?

我有以下DataFramedf ):

 import numpy as np import pandas as pd df = pd.DataFrame(np.random.rand(10, 5)) 

我通过分配添加更多的列:

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

如何将列mean移到前面,即将其设置为第一列,而不改变其他列的顺序?

一个简单的方法是重新分配dataframe和列表,根据需要重新排列。

这是你现在拥有的:

 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'] 

以任何你想要的方式重新排列列。 这就是我把最后一个元素移到第一个位置的方法:

 In [12]: cols = cols[-1:] + cols[:-1] In [13]: cols Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L] 

然后像这样重新sortingdataframe:

 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'] 

…然后在将其放入第一个函数之前手动重新排列

只需按照您所需的顺序将列名分配给<dataframe>.columns如下所示:

 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 = df.reindex_axis(['mean',0,1,2,3,4], axis=1) 

会做你想要的。

在我的情况(一般forms):

 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) 

您需要按照所需的顺序创build一个新的列列表,然后使用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中,也可以使用此方法按照所需的顺序对列进行重新sorting。

 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()] 
 def order(frame,var): varlist =[w for w in frame.columns if w not in var] frame = frame[var+varlist] return frame 

这个函数有两个参数,第一个是数据集,第二个是你要把数据集中的列。

所以在我的情况下,我有一个数据集称为框架与variablesA1,A2,B1,B2,总计和date。 如果我想把Total带到前面,那我所要做的就是:

 frame = order(frame,['Total']) 

如果我想把Total和Date带到前面,那么我会这样做:

 frame = order(frame,['Total','Date']) 

编辑:

另一个有用的方法是,如果你有一个不熟悉的表,并且你正在寻找具有特定术语的variables,比如VAR1,VAR2,你可以执行如下的操作:

 frame = order(frame,[v for v in frame.columns if "VAR" in v]) 

我自己遇到了一个类似的问题,只是想补充一下我所定下的。 我喜欢改变列顺序的reindex_axis()方法。 这工作:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

你可以做以下(从阿曼的答案借用部分):

 cols = df.columns.tolist() cols.insert(0, cols.pop(-1)) cols >>>['mean', 0L, 1L, 2L, 3L, 4L] df = df[cols] 

这个问题之前已经回答了:

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

如何使用“T”?

 df.T.reindex(['mean',0,1,2,3,4]).T 

set()

一个简单的方法是使用set() ,特别是当你有一个很长的列的列表,不想手动处理它们:

 cols = list(set(df.columns.tolist()) - set(['mean'])) cols.insert(0, 'mean') df = df[cols] 

只需input要更改的列名称,然后设置新位置的索引。

 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) 

我尝试了Wes McKinneybuild议的insert()函数。

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

这就得到了Timmie想要的结果,而不需要移动最后一列。

我相信@阿曼的答案是最好的,如果你知道另一列的位置。

如果你不知道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 

最简单的方法就是像这样改变列名的顺序

df = df[['mean', Col1,Col2,Col3]]

@clocker:你的解决scheme对我非常有帮助,因为我想从一个数据框前面插入两列,我不知道所有列的名字,因为它们是从一个pivot语句生成的。 所以,如果你处于同样的状况:把前面的专栏带到你知道名字的地方,然后让它们跟随“所有其他专栏”,我提出了以下一般性的解决办法;

 df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1) 

DataFrame.sort_index(axis=1)很干净。 在这里检查文档 。 然后concat