我有以下DataFrame(df):

import numpy as np
import pandas as pd

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

我通过分配添加更多列:

df['mean'] = df.mean(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]

其他回答

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

如果您不知道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.insert(0, 'mean', df.pop("mean"))

这个解决方案有点类似于@JoeHeffer的解决方案,但这是一条直线。

这里,我们从数据帧中删除列“mean”,并将其附加到具有相同列名的索引0。

下面是一个超级简单的方法示例。如果您要从excel复制标题,请使用.split('\t')

df = df['FILE_NAME DISPLAY_PATH SHAREPOINT_PATH RETAILER LAST_UPDATE'.split()]

您可以执行以下操作(从Aman的答案中借用零件):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

与上面的答案类似,还有一种方法可以使用deque()及其rotate()方法。rotate方法获取列表中的最后一个元素并将其插入开头:

from collections import deque

columns = deque(df.columns.tolist())
columns.rotate()

df = df[columns]