无法使用.loc更改列顺序(有条件)

时间:2019-06-24 17:02:25

标签: python pandas

我有一个包含许多列的DataFrame,我想根据其他一些列的值来重新组织某些列(不是全部)的顺序。

我尝试使用.loc更改顺序,当我运行代码时,它显示了我想要的内容,但是当我尝试使用它来设置值时,却没有。

例如,我只想更改具有type_Math A的Math_answers的顺序,因此最后2个Ans_Math将是:'ABC'和'ACB'

import pandas as pd
import numpy as np

data = pd.DataFrame({'Type_Bio':['A','A','B','A','B'],
                     'Type_Math':['B','B','B','A','A'],
                     'Ans_Bio':['AEC','ABC','AAC','CBA','BCA'],
                     'Ans_Math':['AEC','ABC','AAC','CBA','BCA']})

data
        Type_Bio  Type_Math     Ans_Bio     Ans_Math
0               A       B           AEC             AEC
1               A       B           ABC             ABC
2               B       B           AAC             AAC
3               A       A           CBA             CBA
4               B       A           BCA             BCA

我使用以下代码拆分了数学答案:

data = pd.concat([data, data.loc[:,'Ans_Math'].str.split('', expand = True).iloc[:,1:4]], axis = 1)
        Type_Bio    Type_Math   Ans_Bio Ans_Math    1   2   3
0           A           B           AEC AEC         A   E   C
1           A           B           ABC ABC         A   B   C
2           B           B           AAC AAC         A   A   C
3           A           A           CBA CBA         C   B   A
4           B           A           BCA BCA         B   C   A

然后,我注意到:

data.loc[data.Type_Math == 'A',np.arange(1, 4)][np.arange(3,0,-1)]

(几乎)给出我想要的(只有我想要的行,才反转!)

    3   2   1
3   A   B   C
4   A   C   B

因此,下一步是设置值:

data.loc[data.Type_Math == 'A',np.arange(1, 4)] = data.loc[data.Type_Math == 'A',np.arange(1, 4)][np.arange(3,0,-1)]
data

但是数据本身并没有改变:

        Type_Bio    Type_Math   Ans_Bio Ans_Math    1   2   3
0           A           B           AEC AEC         A   E   C
1           A           B           ABC ABC         A   B   C
2           B           B           AAC AAC         A   A   C
3           A           A           CBA CBA         C   B   A
4           B           A           BCA BCA         B   C   A

我知道复制设置存在一些错误,但是我认为使用.loc不会出现此问题,有人可以解释和帮助吗?

1 个答案:

答案 0 :(得分:0)

这是您要寻找的:

data.loc[data.Type_Math == 'A', [1,2,3]] = data.loc[data.Type_Math == 'A', [3,2,1]].values

输出:

  Type_Bio Type_Math Ans_Bio Ans_Math  1  2  3
0        A         B     AEC      AEC  A  E  C
1        A         B     ABC      ABC  A  B  C
2        B         B     AAC      AAC  A  A  C
3        A         A     CBA      CBA  A  B  C
4        B         A     BCA      BCA  A  C  B