我有一个包含多个字母值的数据框,我想对其进行排序。例如
ii A.1 A.2 B.1 B.2
1 Xy foo Ly bar
2 Ab bar Ko foo
因此,我希望根据A.1
和B.1
对每一行进行排序,并根据该顺序重新排序A.2
和B.2
。这将成为:
ii s1 s2 b1 b2
1 Ly bar Xy foo
2 Ab bar Ko foo
我正在尝试使用df.apply(lambda x: x.sort_values())
。但是,我在更改其他列(A.2
和B.2
)的顺序时遇到问题。你会怎么做?
修改 澄清一下,我需要根据已排序 A.2 B.2
和{{指定的顺序对A.1
进行排序1}}。例如:
B.1
成为:
ii A.1 A.2 B.1 B.2
1 Xy mat Ly bar
2 Ab zul Ko foo #shouldn't change
答案 0 :(得分:2)
我认为需要numpy.argsort
按排序数组的位置,然后通过arr中的索引获取值并分配回来:
arr = df[['A.1', 'B.1']].values.argsort()
print (arr)
[[1 0]
[0 1]]
df[['A.1', 'B.1']] = df[['A.1', 'B.1']].values[np.arange(len(arr))[:,None], arr]
df[['A.2', 'B.2']] = df[['A.2', 'B.2']].values[np.arange(len(arr))[:,None], arr]
print (df)
ii A.1 A.2 B.1 B.2
0 1 Ly bar Xy foo
1 2 Ab bar Ko foo
使用新数据:
print (df)
ii A.1 A.2 B.1 B.2
0 1 Ly bar Xy mat
1 2 Ab zul Ko foo