我有以下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)
如何将列的意思移到前面,即将其设置为第一列,而其他列的顺序保持不变?
当前回答
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names:
df[col] = np.random.randint(0,100, size=10000)
您可以尝试以下解决方案:
解决方案1:
df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]
解决方案2:
df = df[['mean', 'x', 'y', 'z']]
解决方案3:
col = df.pop("mean")
df = df.insert(0, col.name, col)
解决方案4:
df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)
解决方案5:
cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]
解决方案6:
order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]
时间比较:
解决方案1:
CPU时间:用户1.05 ms,sys:35µs,总计:1.08 ms壁时间:995µs
解决方案2:
CPU时间:用户933µs,系统:0 ns,总计:933µ壁时间:800µs
解决方案3:
CPU时间:用户0 ns,sys:1.35 ms,总计:1.35 ms壁时间:1.08 ms
解决方案4:
CPU时间:用户1.23毫秒,系统:45µs,总计:1.27毫秒壁时间:986µs
解决方案5:
CPU时间:用户1.09 ms,系统:19µs,总计:1.11 ms壁时间:949µs
解决方案6:
CPU时间:用户955µs,系统:34µs,总计:989µs壁时间:859µs
其他回答
简单地说,
df = df[['mean'] + df.columns[:-1].tolist()]
您可以执行以下操作(从Aman的答案中借用零件):
cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))
cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]
df = df[cols]
这里有一个函数可以对任意数量的列执行此操作。
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
我认为这个函数更简单。您只需在开始或结束处或同时指定列的子集:
def reorder_df_columns(df, start=None, end=None):
"""
This function reorder columns of a DataFrame.
It takes columns given in the list `start` and move them to the left.
Its also takes columns in `end` and move them to the right.
"""
if start is None:
start = []
if end is None:
end = []
assert isinstance(start, list) and isinstance(end, list)
cols = list(df.columns)
for c in start:
if c not in cols:
start.remove(c)
for c in end:
if c not in cols or c in start:
end.remove(c)
for c in start + end:
cols.remove(c)
cols = start + cols + end
return df[cols]
你也可以这样做:
df = df[['mean', '0', '1', '2', '3']]
您可以通过以下方式获取列列表:
cols = list(df.columns.values)
输出将产生:
['0', '1', '2', '3', 'mean']
…然后,在将其放入第一个函数之前,可以手动重新排列