我有一个包含许多列的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不会出现此问题,有人可以解释和帮助吗?
答案 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