使用 Key 参数按多列对 Pandas 数据框进行排序

use*_*068 9 python sorting dataframe pandas

我有一个带有以下列的 pandas 数据框数据框:

df = pd.DataFrame([
    ['A2', 2],
    ['B1', 1],
    ['A1', 2],
    ['A2', 1],
    ['B1', 2],
    ['A1', 1]], 
  columns=['one','two'])
Run Code Online (Sandbox Code Playgroud)

我希望主要按“二”列排序,然后按“一”列排序。对于辅助排序,我想使用自定义排序规则,该规则将按字母字符[A-Z]和尾随数字对列“一”进行排序[0-100]。因此,排序的结果将是:

one two
 A1   1
 B1   1
 A2   1
 A1   2
 B1   2
 A2   2
Run Code Online (Sandbox Code Playgroud)

在使用排序规则之前,我已经对类似于“一”列的字符串列表进行了排序:

def custom_sort(value):
    return (value[0], int(value[1:]))

my_list.sort(key=custom_sort)
Run Code Online (Sandbox Code Playgroud)

如果我尝试通过 pandas 排序应用此规则,我会遇到许多问题,包括:

  1. pandasDataFrame.sort_values()函数像 sort() 函数一样接受用于排序的键,但键函数应该矢量化(根据 pandas 文档)。如果我尝试仅将排序键应用于“一”列,则会收到错误“TypeError:无法将系列转换为 <class 'int'>”
  2. 当您使用 pandasDataFrame.sort_values()方法时,它将排序键应用于您传入的所有列。这将不起作用,因为我想使用本机数字排序首先按列“二”进行排序。

我将如何按照上面提到的方式对 DataFrame 进行排序?

Ale*_*der 3

您可以将列拆分one为其组成部分,将它们作为列添加到数据框中,然后使用 column 对它们进行排序two。最后,删除临时列。

>>> (df.assign(lhs=df['one'].str[0], rhs=df['one'].str[1:].astype(int))
       .sort_values(['two', 'rhs', 'lhs'])
       .drop(columns=['lhs', 'rhs']))
  one  two
5  A1    1
1  B1    1
3  A2    1
2  A1    2
4  B1    2
0  A2    2
Run Code Online (Sandbox Code Playgroud)