【问题标题】:Sort pandas dataframe column based on substring根据子字符串对熊猫数据框列进行排序
【发布时间】:2021-10-07 16:42:39
【问题描述】:

我有一个 pandas 数据框,如下图:

Timestamp_Start Event_ID Duration
    555.54944   Fix_1   0.42248
    559.07281   Fix_10  0.01996
    559.14642   Fix_11  0
    556.03192   Fix_2   0.16113
    556.27985   Fix_3   0.24188
    556.56097   Fix_4   0.04987
    556.65497   Fix_5   0.10748
    556.80859   Fix_6   0.75708
    557.57983   Fix_7   0.11329
    557.75348   Fix_8   0.65643
    558.43665   Fix_9   0.27447
    555.97925   Sac_1   0.04577
    559.09961   Sac_10  0.0404
    559.15302   Sac_11  0.00726
    556.19916   Sac_2   0.07403
    556.52747   Sac_3   0.02789
    556.61865   Sac_4   0.02985
    556.76849   Sac_5   0.0337
    557.57294   Sac_6   0
    557.69965   Sac_7   0.04687
    558.41632   Sac_8   0.01325
    558.71796   Sac_9   0.34552

我想对“Event_ID”列进行排序,以便 Fix_1,Fix_2,Fix_3... 和 Sac_1,Sac_2,Sac_3... 按顺序出现,如下所示:

Timestamp_StartEvent_ID Duration
    555.54944   Fix_1   0.42248
    556.03192   Fix_2   0.16113
    556.27985   Fix_3   0.24188
    556.56097   Fix_4   0.04987
    556.65497   Fix_5   0.10748
    556.80859   Fix_6   0.75708
    557.57983   Fix_7   0.11329
    557.75348   Fix_8   0.65643
    558.43665   Fix_9   0.27447
    559.07281   Fix_10  0.01996
    559.14642   Fix_11  0
    555.97925   Sac_1   0.04577
    556.19916   Sac_2   0.07403
    556.52747   Sac_3   0.02789
    556.61865   Sac_4   0.02985
    556.76849   Sac_5   0.0337
    557.57294   Sac_6   0
    557.69965   Sac_7   0.04687
    558.41632   Sac_8   0.01325
    558.71796   Sac_9   0.34552
    559.09961   Sac_10  0.0404
    559.15302   Sac_11  0.00726

关于如何做到这一点的任何想法?感谢您的帮助。

【问题讨论】:

  • 直接排序似乎可以工作,如果修复信息,Event_ID 是单列吗?df.sort_values('Event_ID', inplace=True)
  • 很遗憾,.sort_values() 不起作用。
  • 你能解释一下为什么它不起作用吗?您还可以添加sort_values 的输出并添加到问题中并指出它不起作用的确切位置。
  • 仅使用排序,会将下划线后面的整数视为字符串,不会给出所需的顺序。

标签: python pandas sorting


【解决方案1】:

数据帧上的正常排序将不起作用,因为您需要将字符串中的整数视为 int 值。

不过,它可以用额外的空间来完成。

你可以像这样制作两列,

df['event'] = df.Event_ID.str.rsplit("_").str[0]
df['idx'] = df.Event_ID.str.rsplit("_").str[-1].astype(int)

现在,对这两列进行排序,

df.sort_values(['event', 'idx'])


    Timestamp_Start Event_ID  Duration  idx event
0         555.54944    Fix_1   0.42248    1   Fix
3         556.03192    Fix_2   0.16113    2   Fix
4         556.27985    Fix_3   0.24188    3   Fix
5         556.56097    Fix_4   0.04987    4   Fix
6         556.65497    Fix_5   0.10748    5   Fix
7         556.80859    Fix_6   0.75708    6   Fix
8         557.57983    Fix_7   0.11329    7   Fix
9         557.75348    Fix_8   0.65643    8   Fix
10        558.43665    Fix_9   0.27447    9   Fix
1         559.07281   Fix_10   0.01996   10   Fix
2         559.14642   Fix_11   0.00000   11   Fix
11        555.97925    Sac_1   0.04577    1   Sac
14        556.19916    Sac_2   0.07403    2   Sac
15        556.52747    Sac_3   0.02789    3   Sac
16        556.61865    Sac_4   0.02985    4   Sac
17        556.76849    Sac_5   0.03370    5   Sac
18        557.57294    Sac_6   0.00000    6   Sac
19        557.69965    Sac_7   0.04687    7   Sac
20        558.41632    Sac_8   0.01325    8   Sac
21        558.71796    Sac_9   0.34552    9   Sac
12        559.09961   Sac_10   0.04040   10   Sac
13        559.15302   Sac_11   0.00726   11   Sac

你可以reset_index,根据需要删除额外的列

【讨论】:

    【解决方案2】:

    一种使用distutils.version的方式:

    import numpy as np
    from distutils.version import LooseVersion
    
    f = np.vectorize(LooseVersion)
    new_df = df.sort_values("Event_ID", key=f)
    print(new_df)
    

    输出:

        Timestamp_Start Event_ID  Duration
    0         555.54944    Fix_1   0.42248
    3         556.03192    Fix_2   0.16113
    4         556.27985    Fix_3   0.24188
    5         556.56097    Fix_4   0.04987
    6         556.65497    Fix_5   0.10748
    7         556.80859    Fix_6   0.75708
    8         557.57983    Fix_7   0.11329
    9         557.75348    Fix_8   0.65643
    10        558.43665    Fix_9   0.27447
    1         559.07281   Fix_10   0.01996
    2         559.14642   Fix_11   0.00000
    11        555.97925    Sac_1   0.04577
    14        556.19916    Sac_2   0.07403
    15        556.52747    Sac_3   0.02789
    16        556.61865    Sac_4   0.02985
    17        556.76849    Sac_5   0.03370
    18        557.57294    Sac_6   0.00000
    19        557.69965    Sac_7   0.04687
    20        558.41632    Sac_8   0.01325
    21        558.71796    Sac_9   0.34552
    12        559.09961   Sac_10   0.04040
    13        559.15302   Sac_11   0.00726
    

    【讨论】:

    • 不错的解决方案!会派上用场的:)
    猜你喜欢
    • 2021-07-03
    • 2014-12-29
    • 2015-11-06
    • 2013-12-15
    • 1970-01-01
    • 2022-11-02
    • 2020-11-06
    • 2012-06-19
    • 2022-07-19
    相关资源
    最近更新 更多