【问题标题】:Sorting a pandas dataframe by a column containing numbers and text按包含数字和文本的列对熊猫数据框进行排序
【发布时间】:2021-08-18 15:45:54
【问题描述】:

我有一个 pandas 数据框,我想按其中一列进行排序。问题是,需要排序的数据如下所示:“'Number 1' - Specimen 'Number 2'”。 我想先按“数字 1”排序,然后按“数字 2”排序。

一个例子:

import pandas as pd

df = pd.DataFrame({'Name': ['12001 - Specimen 10', '12000 - Specimen 1', '12000 - Specimen 10', 
                            '12000 - Specimen 2', '12000 - Specimen 5', '12001 - Specimen 1', 
                            '12001 - Specimen 2'], 
                   'Results': [2, 4, 2, 3, 10, 8, 2]})

df.sort_values('Name')
   Name                   Results
1  12000 - Specimen 1     4
2  12000 - Specimen 10    2
3  12000 - Specimen 2     3
4  12000 - Specimen 5     10
5  12001 - Specimen 1     8
0  12001 - Specimen 10    2
6  12001 - Specimen 2     2

这正确地按第一个数字排序,但对于秒数,它将 10 放在 2 之前。

我已经看到发布了两个类似的问题,但在这些情况下,它们的数字和字符串由“_”分隔,并且答案建议在排序之前将它们分开。我尝试做类似的事情,但最终只按第二个数字排序。

sort dataFrame index containing string and number

Sort DataFrame index that has a string and number

如果可能的话,我更喜欢可以完全在 pandas 中完成而无需其他包的东西。

【问题讨论】:

  • "12001 - Specimen 10" 是一个字符串,所以基本上它们是按字母顺序排序的(或基于字符串的 ASCII 值)。我将首先通过正则表达式解析字符串,然后将样本编号(int 类型)放入另一列。在这种情况下,您可以轻松地按 Specimen 排序。
  • 或者您可以在执行sort_values 时将从正则表达式中提取的结果作为key 传递,这样您就不必添加另一列。

标签: python pandas


【解决方案1】:

我将“名称”列转换为 2 个数字的列表,然后对该列进行排序,然后返回索引。

index = df['Name'].apply(lambda x: list(map(int,x.split('- Specimen')))).argsort().to_list()
df.iloc[index]

【讨论】:

    【解决方案2】:

    您可以做的是拆分Name 列,索引出我们想要的两列,将它们转换为整数,然后执行排序。然后,您可以获取此子帧的索引并使用它来订购原始数据帧。

    sorted_index = df.Name.str.split(' ',expand = True).loc[:,[0,3]].astype(int).sort_values([0,3]).index
    
    sorted_df = df.loc[sorted_index,:]
    

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2019-04-10
      • 2017-12-19
      相关资源
      最近更新 更多