我经常需要使用数据框,其中rownames(pandas中的索引)类似于[a-z][0-9]+
类型(例如' a20',' a21',.. 。或' b1',' b11',' b2',...)
我希望能够仅根据数字对行进行排序。从我可以收集的API中,df.sort_index()
没有采用函数参数来定义排序函数。
在创建数据框时,是否有一种简洁的方法可以实现这一点而无需删除初始字符?
答案 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