如果您不知道 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 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
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
1
您需要按所需顺序创建列的新列表,然后使用 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]
25 回答
在你的情况下,
会做你想要的 .
In my case (general form):
更新2018年1月
If you want to use reindex:
set():
一个简单的方法是使用 set() ,特别是当您有一长串列并且不想手动处理它们时:
简单地说,
DataFrame.sort_index(axis=1)
很干净 . Check doc here . 然后concat
您可以执行以下操作(从Aman的答案中借用部分):
您可以使用
reindex
,它可以用于两个轴:一种简单的方法是使用列表重新分配数据框,根据需要重新排列 .
这就是你现在拥有的:
以您想要的任何方式重新排列
cols
. 这就是我将最后一个元素移动到第一个位置的方式:然后重新排序数据帧,如下所示:
我按照Wes McKinney的建议尝试了
insert()
功能 .这得到了Timmie在一条线上想要的结果,而不需要移动最后一列 .
如果你知道另一列的位置,我相信@Aman's answer是最好的 .
如果您不知道
mean
的位置,但只有其名称,则无法直接使用cols = cols[-1:] + cols[:-1]
. 以下是我能想到的下一个最好的事情:从2018年8月起:
如果您的列名太长而无法输入,那么您可以通过具有以下位置的整数列表指定新订单:
对于OP问题的具体情况:
你也可以这样做:
您可以使用以下命令获取列列表:
输出将产生:
...然后在将其放入第一个函数之前,可以手动重新排列
这是一种移动现有列的方法,该列将修改现有数据框 .
用“T”怎么样?
此功能可以避免您必须列出数据集中的每个变量,只是为了订购其中的一些变量 .
它需要两个参数,第一个是数据集,第二个是数据集中要带到前面的列 .
所以在我的情况下,我有一个名为Frame的数据集,包含变量A1,A2,B1,B2,Total和Date . 如果我想将道达尔带到前线那么我所要做的就是:
如果我想将Total和Date带到前面那么我会:
编辑:
使用它的另一个有用的方法是,如果你有一个不熟悉的表,并且你正在查看其中包含特定术语的变量,例如VAR1,VAR2,......你可以执行以下操作:
我喜欢Shoresh's answer使用set功能删除列,因为我需要保留原始列顺序(具有任意列标签) .
我通过使用boltons包中的IndexedSet来实现这一点 .
我还需要重新添加多个列标签,因此对于更一般的情况,我使用了以下代码:
希望这对于搜索此线程以获得一般解决方案的任何人都有用 .
我自己遇到了一个类似的问题,只想添加我所确定的内容 . 我喜欢
reindex_axis() method
来更改列顺序 . 这工作:基于@Jorge评论的另一种方法:
尽管
reindex_axis
在微基准测试中似乎比reindex
略快,但我认为我更倾向于后者 .最简单的方法是更改列名的顺序,如下所示
df = df[['mean', Col1,Col2,Col3]]
将任何列移动到任何位置:
怎么样:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
只需键入要更改的列名称,然后设置新位置的索引 .
对于您的情况,这将是:
只需按照您想要的顺序分配列名称:
现在,'mean'专栏出现在前面:
这个问题已经回答before但现在不推荐使用reindex_axis所以我建议使用:
这是为任意数量的列执行此操作的函数 .
您需要按所需顺序创建列的新列表,然后使用
df = df[cols]
以此新顺序重新排列列 .您还可以使用更通用的方法 . 在此示例中,最后一列(由-1表示)作为第一列插入 .
如果列存在于DataFrame中,您还可以使用此方法按所需顺序重新排序列 .
@clocker:你的解决方案对我很有帮助,因为我想在前面带两列从我不确切知道所有列名称的数据框中,因为它们是之前从pivot语句生成的 . 所以,如果你处于相同的情况:要在前面列出你知道名称的列,然后让它们跟随“所有其他列”,我想出了以下一般解决方案;