【问题标题】:Pandas sort columns by namePandas 按名称对列进行排序
【发布时间】:2019-07-25 22:10:40
【问题描述】:

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

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 给我重复的列名。

【问题讨论】:

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

标签: python pandas


【解决方案1】:

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

【讨论】:

  • 你还挺快的呵呵
【解决方案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

【讨论】:

    【解决方案3】:

    这是使用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
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2021-07-06
      • 2017-04-28
      相关资源
      最近更新 更多