
本文介绍使用 Pandas 对 DataFrame 中连续出现的相同基因名(如 g1, g4)自动追加 _TE1, _TE2 等序号别名的方法,仅对长度 ≥2 的连续块生效,孤立值保持不变。
本文介绍使用 pandas 对 dataframe 中连续出现的相同基因名(如 `g1`, `g4`)自动追加 `_te1`, `_te2` 等序号别名的方法,仅对长度 ≥2 的连续块生效,孤立值保持不变。
在生物信息学或基因组数据分析中,常需对原始注释中连续重复的基因 ID 进行唯一化标记(例如区分同一基因的不同转录本或外显子事件)。关键在于:仅对“连续出现”的重复值编号,而非全局去重或按频次排序——这要求我们精准识别“连续块”(run-length encoding),而非简单按 groupby('gene_id') 分组。
以下为推荐的高效、向量化解决方案(无需循环或 itertools.groupby):
import pandas as pd
# 示例数据
df_genes_data = {'gene_id': ['g0', 'g1', 'g1', 'g2', 'g3', 'g4', 'g4', 'g4']}
df_genes = pd.DataFrame(df_genes_data)
# 核心逻辑:识别连续块并编号
s = df_genes['gene_id']
group = s.ne(s.shift()).cumsum() # 为每个连续块分配唯一组号
g = s.groupby(group)
m = g.transform('size').gt(1) # 标记长度 >1 的连续块(即需加别名)
df_genes.loc[m, 'gene_id'] += '_TE' + (g.cumcount() + 1).astype(str)执行后,df_genes 将精确生成目标输出:
gene_id 0 g0 1 g1_TE1 2 g1_TE2 3 g2 4 g3 5 g4_TE1 6 g4_TE2 7 g4_TE3
关键步骤解析:
-
s.ne(s.shift()).cumsum():检测当前值是否不同于前一行(ne即!=),首次出现时为True,累积求和形成连续块 ID(如[1,2,2,3,4,5,5,5]); -
g.transform('size').gt(1):对每个连续块计算其长度,并生成布尔掩码m,仅True行参与后续修改; -
g.cumcount() + 1:在每块内从 1 开始编号(cumcount()默认从 0 起始); -
loc[m, ...]确保仅修改需标注的行,避免干扰孤立值(如g0,g2,g3)。
注意事项:
- ✅ 该方法严格基于物理顺序与连续性,不依赖
gene_id全局唯一性或字典序; - ⚠️ 若数据未按
gene_id连续排列(如['g1','g2','g1']),结果将按实际行序分组,非按基因名聚类; - ? 可轻松自定义前缀/后缀(如改为
_iso1,_exon_001),只需修改字符串拼接部分; - ? 避免使用
for循环或iterrows(),在大数据集上性能差距可达百倍以上。
此方案兼顾可读性、健壮性与执行效率,是处理序列化标签任务的标准 Pandas 实践。

















