按独特的值对列进行排序

3

我有这个数据框:

  AAA  X_980  X_100  X_990  X_1100  X_2200  X_Y_100  X_Y_2200  X_Y_990  X_Y_1100  X_Y_980  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
  100      6      6      6       3       4        1         7        5         1        9         9         2         7          3          7    3      8
  980      2      9      5       5       9        3         6        2         1        3         1         8         2          9          4    8      4
  990      8      8      7       7       9        3         5        7         3        1         5         5         6          6          1    3      4
 1100      6      5      4       7       4        6         2        1         6        2         3         5         3          9          7    5      2
 2200      7      4      3       2       4        5         9        1         9        4         6         5         8          7          7    7      9

如您所见,列AAA有5个唯一值,有3组列:X_X_Y_X_10_,后面跟着每个唯一值的后缀。我希望改变列的顺序,使每组列按唯一值排序(升序)。
  AAA  X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
  100      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7    3      8
  980      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4    8      4
  990      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1    3      4
 1100      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7    5      2
 2200      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7    7      9
1个回答

4

方法一

通过简单的列操作 -

c = df.columns.values.copy()
c1 = df1.columns
c[np.isin(c,c1)] = c1
df_out = df.loc[:,c]

样例输出 -

In [174]: df_out
Out[174]: 
    AAA  X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
0   100      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7    3      8
1   980      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4    8      4
2   990      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1    3      4
3  1100      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7    5      2
4  2200      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7    7      9

方法 #2:将新数据推送到前面

In [117]: df1 = df[[i+str(j) for i in ['X_', 'X_Y_', 'X_10_'] for j in df.AAA]]

In [118]: c,c1 = df.columns,df1.columns

In [119]: pd.concat(( df1, df[c[~np.isin(c,c1)]]),axis=1)
Out[119]: 
   X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200   AAA  X_A  X_A_B
0      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7   100    3      8
1      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4   980    8      4
2      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1   990    3      4
3      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7  1100    5      2
4      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7  2200    7      9

谢谢。我已经改变了输入数据并添加了两列。您的解决方案需要改变吗? - qwerty
@qwerty 是的,稍微修改了一下。 - Divakar
如果我有100个类似这样的列会怎么样呢? :) - qwerty
@qwerty 请问将列 AAA 移动到输出的末尾是否可以? - Divakar
没问题。 - qwerty
1
@qwerty 刚刚添加了方法#1,可能会引起你的兴趣。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接