pandas - 如何更改DataFrame列的顺序?

我有以下DataFrame (df ):


import numpy as np
import pandas as pd

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

添加更多的列:


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

如何将mean列移动到前面,例如将它设为第一列,保留其他列的顺序?

时间:

一种简单的方法是,使用列表重新分配数据框,并根据需要重新排列。


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

你也可以执行如下操作:


df = df[['mean', '0', '1', '2', '3']]

获取列的列表:


cols = list(df.columns.values)

输出将产生:


['0', '1', '2', '3', 'mean']

然后在将它放入第一个函数之前手动重新排序


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

我喜欢reindex_axis方法来更改列顺序,这工作正常:

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

简单点


df =df.reindex(columns=['mean']+df.columns)
df['mean'] = df.mean(1)

按你想要的顺序指定列名称,如下所示:


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


def order(frame,var):
 varlist =[w for w in frame.columns if w not in var]
 frame = frame[var+varlist]
 return frame 

这里函数接受两个参数,第一个是数据集,第二个是数据集中的列,你希望将它们带到前面。

在我的例子中,我有一个名为框架的数据集,变量为 A1,A2,B1,B2,Total和日期。 如果我想把总的放在前面,那么我需要做的就是:


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

如果我想将总和日期带到前面,那么我将:


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

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

...