Skip to main content
 首页 » 编程设计

python之Pandas 使用自定义函数按索引对行进行排序

2025年05月04日13yjmyzz

我经常需要处理行名(pandas 中的索引)类似于 [a-z][0-9]+ 类型的数据框(例如 'a20'、'a21'、. .. 或 'b1','b11','b2',...)

我希望能够仅根据数字对行进行排序。根据我对 API 的了解,df.sort_index() 不采用我可以定义排序函数的函数参数。

有没有一种巧妙的方法可以实现这一点,而无需在创建数据框时删除初始字符?

请您参考如下方法:

您可以使用 extract , 转换为 int 并通过 argsort 获取排序值的位置,最后使用 iloc:

(从@Dark借用数据):

df = df.iloc[df.index.str.extract('(\d+)', expand=False).astype(int).argsort()] 
print (df) 
     0 
a5   5 
a6   6 
a10  2 
a11  3 
b11  7 
a12  1 
b12  8 
a15  4 

解释:

df = pd.DataFrame([1,2,3,4,5,6,7,8],index=['a12','a10','a11','a15','a5','a6','b11','b12']) 
print (df) 
     0 
a12  1 
a10  2 
a11  3 
a15  4 
a5   5 
a6   6 
b11  7 
b12  8 

第一个extract所有整数:

print (df.index.str.extract('(\d+)', expand=False)) 
Index(['12', '10', '11', '15', '5', '6', '11', '12'], dtype='object') 

转换为整数:

print (df.index.str.extract('(\d+)', expand=False).astype(int)) 
Int64Index([12, 10, 11, 15, 5, 6, 11, 12], dtype='int64') 

获取按 argsort 排序的值的位置:

print (df.index.str.extract('(\d+)', expand=False).astype(int).argsort()) 
[4 5 1 2 6 0 7 3] 

最后按位置选择值 iloc :

print (df.iloc[df.index.str.extract('(\d+)', expand=False).astype(int).argsort()]) 
     0 
a5   5 
a6   6 
a10  2 
a11  3 
b11  7 
a12  1 
b12  8 
a15  4