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 排序应用此规则,我会遇到许多问题,包括:
DataFrame.sort_values()函数像 sort() 函数一样接受用于排序的键,但键函数应该矢量化(根据 pandas 文档)。如果我尝试仅将排序键应用于“一”列,则会收到错误“TypeError:无法将系列转换为 <class 'int'>”DataFrame.sort_values()方法时,它将排序键应用于您传入的所有列。这将不起作用,因为我想使用本机数字排序首先按列“二”进行排序。我将如何按照上面提到的方式对 DataFrame 进行排序?
您可以将列拆分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)