pandas使用自定义函数按索引对行进行排序

时间:2018-02-05 16:16:37

标签: python pandas

我经常需要使用数据框,其中rownames(pandas中的索引)类似于[a-z][0-9]+类型(例如' a20',' a21',.. 。或' b1',' b11',' b2',...)

我希望能够仅根据数字对行进行排序。从我可以收集的API中,df.sort_index()没有采用函数参数来定义排序函数。

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

3 个答案:

答案 0 :(得分:3)

您可以使用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')

转换为integer s:

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

答案 1 :(得分:2)

使用natsort按索引列表排序,然后reindex

df=pd.DataFrame({'v':[1,2,3]},index=['b1','b11','b2'])

from natsort import natsorted, ns


df.reindex(natsorted(df.index.tolist(), alg=ns.IGNORECASE))

Out[795]: 
     v
b1   1
b2   3
b11  2

答案 2 :(得分:2)

您可以使用sorted和reindex,即

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

import re
df.reindex(sorted(df.index,key=lambda x: re.sub('[A-z]','',x)))


    0
a10  2
a11  3
b11  7
a12  1
b12  8
a15  4
a5   5
a6   6