Pandas按列名称排序

6
我有一个数据框,我想按照名称对列进行排序。
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,从而给我带来了重复的列名。


1
数字中的下划线并没有实际意义,只是为了方便阅读。因此,13_1既不是1.31也不是13.1,而只是131(参见PEP515)。但是,由于列名显示为13_1,它们肯定是字符串。 - Stef
使用PEP515解释对列进行排序:d = dict(zip(map(int, df.columns), df.columns)); df = df[map(d.get, sorted(map(int, df.columns)))] - Stef
3个回答

8

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

你很快呀 呵呵 - BENY

5
首先,来自其他答案的natsort看起来很棒,我肯定会使用它。
如果您不想安装新软件包:
似乎您想要按数字顺序排序,首先按_之前的数字排序,然后将其作为平局的解决方法再按其后面的数字排序。这意味着您只需要通过_拆分为元组排序顺序。
请尝试这个:
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

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

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