我有一个需要排序的列表。先按new_name,再按nf,再按no。主要的难点是柱子no和nf。我不能将它们转换为类型int,所以我必须使用自然排序。
如何将两个查询合并为一个?
PSnew_name, nf, no是从name.
def natural_sort_key(s, _re=re.compile(r'(\d+)')):
return [int(t) if i & 1 else t.lower() for i, t in enumerate(_re.split(s.no))]
sorted_1 = sorted(data, key=operator.attrgetter('new_name','nf'))
sorted_2 = sorted(data, key=natural_sort_key)
name:'ТП 2-1/400-Ф1-1-ЖБ'
new_name:'ТП 2-1/400-Ф1'
nf:'Ф1'
no:'1'
name:'ТП 2-1/400-Ф2-2-ЖБ'
new_name:'ТП 2-1/400-Ф2'
nf:'Ф1'
no:'2'
name:'ТП 2-1/400-Ф2-2/1-ЖБ'
new_name:'ТП 2-1/400-Ф2'
nf:'Ф2'
no:'2/1'
name:'ТП 2-1/400-Ф10-1/1-ЖБ'
new_name:'ТП 2-1/400-Ф10'
nf:'Ф10'
no:'1/1'
输出应如下所示:
ТП 2-1/400-Ф1-1-ЖБ
ТП 2-1/400-Ф2-1-ЖБ
ТП 2-1/400-Ф2-2/1-ЖБ
ТП 2-1/400-Ф10-1/1-ЖБ
我尝试这样:
df = pd.DataFrame([t.__dict__ for t in data])
import natsort as ns
df['nf'] = pd.Categorical(df['nf'], ordered=True, categories= ns.natsorted(df['nf'].unique()))
df['no'] = pd.Categorical(df['no'], ordered=True, categories= ns.natsorted(df['no'].unique()))
df.sort_values(['new_name', 'nf','no'], ascending=[True, True,True])
可以看出,按排序是可行的nf,但no总的来说排序不正确:
name nf no new_name
0 ТП 2-1/400-Ф1-1-ЖБ Ф1 1 ТП 2-1/400-Ф1
1 ТП 2-1/400-Ф1-10-ЖБ Ф1 10 ТП 2-1/400-Ф1
2 ТП 2-1/400-Ф1-11-ЖБ Ф1 11 ТП 2-1/400-Ф1
3 ТП 2-1/400-Ф1-12-ЖБ Ф1 12 ТП 2-1/400-Ф1
4 ТП 2-1/400-Ф1-13-ЖБ Ф1 13 ТП 2-1/400-Ф1
.. ... .. .. ...
810 ТП 8-1/160-Ф1-75-ЖБ Ф1 75 ТП 8-1/160-Ф1
811 ТП 8-1/160-Ф1-76-ЖБ Ф1 76 ТП 8-1/160-Ф1
812 ТП 8-1/160-Ф1-77-ЖБ Ф1 77 ТП 8-1/160-Ф1
813 ТП 8-1/160-Ф1-8-ЖБ Ф1 8 ТП 8-1/160-Ф1
814 ТП 8-1/160-Ф1-9-ЖБ Ф1 9 ТП 8-1/160-Ф1
[815 rows x 4 columns]
试试这样:
结果: