pandas dataframe双列排序实现:整数列优先,字母数字列自定义排序
96孔板场景pandas自定义排序实现方案
核心思路是从孔位字符串中拆分出数字后缀、字母前缀两个辅助排序键,再按指定优先级排序即可。
前置说明
以下示例默认你的第一列整数列名为plate_id,第二列孔位列名为well,可自行替换为实际列名。
完整实现代码
import pandas as pd # 示例测试数据,替换为你自己的DataFrame即可 df = pd.DataFrame({ 'plate_id': [2, 1, 1, 1, 2], 'well': ['C3', 'B10', 'A2', 'A1', 'B1'] }) # 拆分孔位的前缀字母和后缀数字 df[['well_letter', 'well_num']] = df['well'].str.extract(r'^([A-H])(\d{1,2})$') # 后缀数字必须转为整数,避免字符串排序时出现"10"排在"2"前的错误 df['well_num'] = df['well_num'].astype(int) # 按优先级排序:第一优先整数列升序,第二优先孔位数字升序,第三优先孔位字母升序 df_sorted = df.sort_values(by=['plate_id', 'well_num', 'well_letter'], ignore_index=True) # 可选:删除临时辅助列,仅保留原始数据列 df_sorted = df_sorted[['plate_id', 'well']]
无临时列简化写法(pandas 1.1.0及以上版本支持)
如果不想新增临时辅助列,可以直接在sort_values的key参数中实现排序逻辑:
df_sorted = df.sort_values( by=['plate_id', 'well'], key=lambda col: col if col.name != 'well' \ else col.str.extract(r'(\d{1,2})$', expand=False).astype(int), ignore_index=True )
验证说明
上述代码执行后,输出结果会严格符合96孔板业务排序规则:先按板号升序,同板内先按孔位数字从小到大排序,同数字的孔位按字母A到H升序排列。
内容的提问来源于stack exchange,提问作者hickz
相关产品推荐
相关产品推荐

