我有以下DataFrame(df):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
我通过分配添加更多列:
df['mean'] = df.mean(1)
如何将列的意思移到前面,即将其设置为第一列,而其他列的顺序保持不变?
我有以下DataFrame(df):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
我通过分配添加更多列:
df['mean'] = df.mean(1)
如何将列的意思移到前面,即将其设置为第一列,而其他列的顺序保持不变?
当前回答
我想到了和Dmitriy Work一样的答案,显然是最简单的:
df["mean"] = df.mean(1)
l = list(np.arange(0,len(df.columns) -1 ))
l.insert(0,-1)
df.iloc[:,l]
其他回答
这里有一个函数可以对任意数量的列执行此操作。
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
您可以执行以下操作(从Aman的答案中借用零件):
cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))
cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]
df = df[cols]
简单地说,
df = df[['mean'] + df.columns[:-1].tolist()]
我很喜欢Shoresh的回答:当你不知道位置时,使用集合功能来删除列,但这不符合我的目的,因为我需要保持原始的列顺序(具有任意的列标签)。
不过,我通过使用boltons包中的IndexedSet实现了这一点。
我还需要重新添加多个列标签,因此对于更一般的情况,我使用了以下代码:
from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]
希望这对搜索此线程以寻求通用解决方案的任何人都有用。
对我来说,一个非常简单的解决方案是在df.columns上使用.rendex:
df = df[df.columns.reindex(['mean', 0, 1, 2, 3, 4])[0]]