You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中对DataFrame的CHROM列进行自然排序?

按染色体编号数值排序的实现方法

普通的sort_values按字符串字典序排序时,会把chr12排在chr3前面,这是因为字符串比较是逐字符进行的,'1'的ASCII码小于'3'。要实现按染色体编号的数值大小排序,有两种常用方法:

方法一:提取数字部分作为排序依据

通过正则提取染色体编号中的数字,转为整数后排序:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({'CHROM': ['chr1', 'chr5', 'chr12', 'chr9', 'chr3']})

# 提取数字并转为整数,生成临时排序列
df['chrom_num'] = df['CHROM'].str.extract(r'(\d+)').astype(int)
# 按数字列排序后删除临时列
sorted_df = df.sort_values(by='chrom_num').drop(columns='chrom_num')

# 输出结果
print(sorted_df)

执行后得到的结果:

CHROM
0   chr1
4   chr3
1   chr5
3   chr9
2  chr12

方法二:使用自然排序库natsort

natsort支持自然排序规则,能自动识别字符串中的数字并按数值排序,无需手动提取数字:

  1. 先安装库:
pip install natsort
  1. 实现排序的代码:
import pandas as pd
from natsort import index_natsorted

df = pd.DataFrame({'CHROM': ['chr1', 'chr5', 'chr12', 'chr9', 'chr3']})

# 利用自然排序的索引对DataFrame重新排序
sorted_df = df.iloc[index_natsorted(df['CHROM'])]

# 输出结果
print(sorted_df)

这个方法更简洁,尤其适合处理复杂的带数字字符串排序场景。

内容的提问来源于stack exchange,提问作者Lucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:25:06