我有一个pandas dataframe,包含以下列:
df = pd.DataFrame([
['A2', 2],
['B1', 1],
['A1', 2],
['A2', 1],
['B1', 2],
['A1', 1]],
columns=['one','two'])
我希望首先按照“two”列进行排序,然后再按照“one”列进行排序。对于第二个排序规则,我想使用自定义排序规则,将“one”列按字母字符[A-Z]
和尾随数字[0-100]
进行排序。因此,排序的结果应为:
one two
A1 1
B1 1
A2 1
A1 2
B1 2
A2 2
在使用类似以下排序规则之前,我已经按照“one”列对字符串列表进行了排序:
def custom_sort(value):
return (value[0], int(value[1:]))
my_list.sort(key=custom_sort)
如果我尝试通过pandas的排序应用此规则,我会遇到许多问题,包括:
- pandas的
DataFrame.sort_values()
函数接受一个关键字来进行排序,就像sort()函数一样,但关键字函数应该是矢量化的(根据pandas文档)。如果我只将排序关键字应用于列'one',则会出现错误"TypeError: cannot convert the series to <class 'int'>" - 当使用pandas的
DataFrame.sort_values()
方法时,它将对您传入的所有列应用排序关键字。这样做不起作用,因为我想首先按列'two'进行本地数值排序。
我该如何按照上述要求对DataFrame进行排序?
natsort
包)对列进行排序,并避免创建临时列? - Agostino