Question:调换column到想要的位置

"""以如下DataFrame为例"""
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
df['mean'] = df.mean(1)  # 即 df.mean(axis=1),计算columns的均值
print(df)

我知道df['mean'] = df.mean(1)可以加上平均值列(函数pandas.DataFrame.mean链接)。但是如果我想把mean列放到第1列,或者c列的位置(即第3列)怎么做呢?


Answer 1 使用list.insert()

""" 目标:把"mean"放到第一列"""
cols = df.columns.tolist()                     # 把df的列名称,取出来放到一个list里边。即返回['a', 'b', 'c', 'd', 'e', 'mean']
cols.insert(0, cols.pop(cols.index('mean')))   # pop()把mean从cols列表里挖出来,通过位置参数“0”,然后放到第一列。
df_final = df[cols]                            # df按照cols序列,把mean字段放到了第一列

print(df_final)
# 结果如下
       mean         a         b         c         d         e
0  0.507075  0.263543  0.537802  0.441994  0.821771  0.470263
1  0.471259  0.441606  0.666618  0.288648  0.126873  0.832552
2  0.416545  0.475424  0.246417  0.182164  0.453856  0.724866
3  0.688879  0.773911  0.625324  0.719911  0.819626  0.505623
4  0.682245  0.109669  0.895214  0.887555  0.941115  0.577671
5  0.424046  0.272191  0.608281  0.425871  0.710838  0.103048
6  0.661013  0.874205  0.600051  0.983872  0.431361  0.415577
7  0.605521  0.734624  0.543319  0.402324  0.472205  0.875135
8  0.570878  0.112548  0.937914  0.333734  0.810133  0.660061
9  0.326754  0.196427  0.012119  0.224301  0.921659  0.279263

Answer 2,即Answer1的更进一步

因为:

cols = df.columns.tolist()
a = cols.index('mean')

等价于
a = df.columns.get_loc('mean') # 与之对应的还有Index的操作: df.index.get_loc(‘index_name’)

所以:

cols.insert(cols.index('c'), cols.pop(cols.index('mean')))   # cols.index('c')返回'c'在cols的位置信息,

df_final = df[cols]
# 结果如下
          a         b      mean         c         d         e
0  0.860127  0.726879  0.666938  0.934172  0.070063  0.743448
1  0.968780  0.480477  0.545988  0.808154  0.100302  0.372227
2  0.862920  0.808950  0.641398  0.125624  0.478846  0.930653
3  0.580197  0.503121  0.320077  0.325538  0.071035  0.120495
4  0.745048  0.787395  0.554878  0.726347  0.078876  0.436725
5  0.370106  0.220008  0.403898  0.296168  0.647584  0.485626
6  0.966086  0.307910  0.677990  0.671499  0.980961  0.463494
7  0.586902  0.888019  0.709354  0.869333  0.271431  0.931085
8  0.170236  0.941333  0.676650  0.862466  0.502819  0.906397
9  0.447175  0.547105  0.399189  0.284198  0.518901  0.198565

附注:

list.insert(
index,                     # int数值,指定我们要插入的列位置
element)                  # 要插入的元素  
DataFrame.insert(
loc,                        # int数值,指定我们要插入的列位置
column,                     # 设定要插入列的名称
value,                      # 要插入列的值
allow_duplicates=False)     # 如果我们起的列名称在df里边已经被占用了,是否允许重名的现象存在。默认不可以。