熊猫按名称对列进行排序

时间:2019-07-25 13:56:03

标签: python pandas

我有以下数据框,在此我想根据名称对列进行排序。

1 | 13_1 | 13_10| 13_2  | 2   | 3
9 |  31  | 2    |  1    | 3   | 4

我正在尝试通过以下方式对列进行排序:

1 |  2  | 3    | 13_1  | 13_2  | 13_10
9 |  3  | 4    |  31   |  1    | 2

我一直在尝试使用df.sort_index(axis=1, inplace=True)解决此问题,但是结果却与我的初始数据帧相同。即:

1 | 13_1 | 13_10| 13_2  | 2   | 3
9 |  31  | 2    |  1    | 3   | 4

似乎它将13_1识别为1.31而不是13.1。此外,我尝试将列名从字符串转换为浮点型。但是,事实证明,将13_1和13_10都视为13.1,给了我重复的列名。

3 个答案:

答案 0 :(得分:6)

natsort

from natsort import natsorted

df = df.reindex(natsorted(df.columns), axis=1)

#   1  2  3  13_1  13_2  13_10
#0  9  3  4    31     1      2

答案 1 :(得分:4)

这是使用natsorted

的一种方法
from natsort import natsorted, ns
df=df.reindex(columns=natsorted(df.columns))
Out[337]: 
   1  2  3  13_1  13_2  13_10
0  9  3  4    31     1      2

我们与pandas没有第三者库的另一种方式:-)

idx=df.columns.to_series().str.split('_',expand=True).astype(float).reset_index(drop=True).sort_values([0,1]).index
df=df.iloc[:,idx]
Out[355]: 
   1  2  3  13_1  13_2  13_10
0  9  3  4    31     1      2

答案 2 :(得分:2)

首先,其他答案中的natsort看起来很棒,我会完全使用它。

如果您不想安装新软件包:

好像您想按照数字进行排序,首先是按_之前的数字,然后是作为平局的数字。这意味着在按tuple拆分为元组时,您只需要一个_排序顺序。

尝试一下:

df = df[sorted(df.columns, key=lambda x: tuple(map(int,x.split('_'))))]

输出:

1  2  3  13_1  13_2  13_10
9  3  4    31     1      2