按顺序修复列

时间:2018-05-10 13:11:40

标签: python pandas

我已粘贴了df的某些部分,如下所示,但实际df中有400多列。

 >>> df_final
   c   d name  e   f  g   h  g   h
0  0   0   aa  0   0  0   0  0   0
1  1   2   bb  1   2  1   2  1   2
2  2   4   cc  2   4  2   4  2   4
3  3   6   dd  3   6  3   6  3   6
4  4   8   ee  4   8  4   8  4   8
5  5  10   ff  5  10  5  10  5  10
6  6  12   gg  6  12  6  12  6  12

我想要'name'和'c'以及第一和第二位置,但其他列的顺序无关紧要。我想用

cols = ['name' , 'c']
col_position = [1 , 2]

如何使用list cols和col_position重新排序数据框? 如何为cols设置数据类型为str,为其他列设置float?

提前致谢

3 个答案:

答案 0 :(得分:1)

构建要按

切片的列表
cols = ['name', 'c']
df[cols + df.columns.difference(cols).tolist()]

  name  c   d  e   f  g  g.1   h  h.1
0   aa  0   0  0   0  0    0   0    0
1   bb  1   2  1   2  1    1   2    2
2   cc  2   4  2   4  2    2   4    4
3   dd  3   6  3   6  3    3   6    6
4   ee  4   8  4   8  4    4   8    8
5   ff  5  10  5  10  5    5  10   10
6   gg  6  12  6  12  6    6  12   12

切片,dropjoin

cols = ['name', 'c']
df[cols].join(df.drop(cols, 1))

  name  c   d  e   f  g   h  g.1  h.1
0   aa  0   0  0   0  0   0    0    0
1   bb  1   2  1   2  1   2    1    2
2   cc  2   4  2   4  2   4    2    4
3   dd  3   6  3   6  3   6    3    6
4   ee  4   8  4   8  4   8    4    8
5   ff  5  10  5  10  5  10    5   10
6   gg  6  12  6  12  6  12    6   12

切片,dropconcat

cols = ['name', 'c']
pd.concat([df[cols], df.drop(cols, 1)], axis=1)

  name  c   d  e   f  g   h  g.1  h.1
0   aa  0   0  0   0  0   0    0    0
1   bb  1   2  1   2  1   2    1    2
2   cc  2   4  2   4  2   4    2    4
3   dd  3   6  3   6  3   6    3    6
4   ee  4   8  4   8  4   8    4    8
5   ff  5  10  5  10  5  10    5   10
6   gg  6  12  6  12  6  12    6   12

iloc

的位置
positions = df.columns.map({'name': 0, 'c': 1}.get).argsort() 
df.iloc[:, positions]

  name  c   d  e   f  g   h  g.1  h.1
0   aa  0   0  0   0  0   0    0    0
1   bb  1   2  1   2  1   2    1    2
2   cc  2   4  2   4  2   4    2    4
3   dd  3   6  3   6  3   6    3    6
4   ee  4   8  4   8  4   8    4    8
5   ff  5  10  5  10  5  10    5   10
6   gg  6  12  6  12  6  12    6   12

或关注OP的变量

cols = ['name' , 'c']
col_position = [1 , 2]

m = dict(zip(cols, col_position))
positions = df.columns.map(m.get).argsort() 
df.iloc[:, positions]

答案 1 :(得分:1)

我认为需要:

df1 = df[cols + np.setdiff1d(df.columns, cols).tolist()]
print (df1)
 name  c   d  e   f  g  g.1   h  h.1
0   aa  0   0  0   0  0    0   0    0
1   bb  1   2  1   2  1    1   2    2
2   cc  2   4  2   4  2    2   4    4
3   dd  3   6  3   6  3    3   6    6
4   ee  4   8  4   8  4    4   8    8
5   ff  5  10  5  10  5    5  10   10
6   gg  6  12  6  12  6    6  12   12

c1 = df.columns[col_position].tolist()
df1 = df[c1 + np.setdiff1d(df.columns, c1).tolist()]
print (df1)
    d name  c  e   f  g  g.1   h  h.1
0   0   aa  0  0   0  0    0   0    0
1   2   bb  1  1   2  1    1   2    2
2   4   cc  2  2   4  2    2   4    4
3   6   dd  3  3   6  3    3   6    6
4   8   ee  4  4   8  4    4   8    8
5  10   ff  5  5  10  5    5  10   10
6  12   gg  6  6  12  6    6  12   12

选择按位置替代:

c1 = np.arange(len(df.columns))
df1 = df.iloc[:, col_position + np.setdiff1d(c1, col_position).tolist()]
print (df1)
    d name  c  e   f  g   h  g.1  h.1
0   0   aa  0  0   0  0   0    0    0
1   2   bb  1  1   2  1   2    1    2
2   4   cc  2  2   4  2   4    2    4
3   6   dd  3  3   6  3   6    3    6
4   8   ee  4  4   8  4   8    4    8
5  10   ff  5  5  10  5  10    5   10
6  12   gg  6  6  12  6  12    6   12

答案 2 :(得分:0)

我试过了,

l=df.columns.values
cols = ['name' , 'c']
col_position = [1 , 2]

for u in zip(cols,col_position):
    l.remove(u[0])
    l.insert(u[1],u[0])
df=df[l]