基于pandas数据帧中的2列对多列进行排序

时间:2018-04-23 11:48:35

标签: python pandas dataframe

我有一个包含多个字母值的数据框,我想对其进行排序。例如

ii     A.1     A.2      B.1     B.2
1      Xy      foo      Ly      bar
2      Ab      bar      Ko      foo

因此,我希望根据A.1B.1对每一行进行排序,并根据该顺序重新排序A.2B.2。这将成为:

ii     s1      s2       b1      b2
1      Ly      bar      Xy      foo
2      Ab      bar      Ko      foo

我正在尝试使用df.apply(lambda x: x.sort_values())。但是,我在更改其他列(A.2B.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

1 个答案:

答案 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