
本文介绍使用 Pandas 对 DataFrame 中连续出现的相同基因名(如 gene_id)自动添加 _TE1、TE2 等递增别名的方法,仅对长度 ≥2 的连续段生效,孤立或非连续重复项保持不变。
本文介绍使用 pandas 对 dataframe 中连续出现的相同基因名(如 `gene_id`)自动添加 `_te1`、`te2` 等递增别名的方法,仅对长度 ≥2 的连续段生效,孤立或非连续重复项保持不变。
在生物信息学或基因组数据分析中,常需对原始注释中连续重复的基因 ID 进行去重标记(如区分同一基因的不同转录本变体),但又不能简单全局去重——因为非连续重复(如 g1, g2, g1)应保留原名。此时,识别“连续块”并按块内顺序编号是关键。
Pandas 提供了高效向量化方案,无需循环或手动索引判断。核心思路分三步:
-
划分连续组:利用
Series.ne(Series.shift())标记每行是否与上一行不同,再用.cumsum()生成唯一组 ID; -
筛选有效组:通过
groupby.transform('size') > 1找出长度超过 1 的连续块; -
生成序号后缀:对每个连续组内调用
.cumcount() + 1得到从 1 开始的序号,并拼接为_TE{N}形式。
以下是完整可运行代码:
import pandas as pd
# 构建示例数据
df_genes_data = {'gene_id': ['g0', 'g1', 'g1', 'g2', 'g3', 'g4', 'g4', 'g4']}
df_genes = pd.DataFrame(df_genes_data)
# 核心逻辑:为连续重复项添加 TE 编号
s = df_genes['gene_id']
group = s.ne(s.shift()).cumsum() # 步骤1:生成连续组标签
g = s.groupby(group)
m = g.transform('size').gt(1) # 步骤2:标记需重命名的行(True 表示属于长度≥2的连续块)
# 步骤3:仅对匹配行追加后缀
df_genes.loc[m, 'gene_id'] += '_TE' + (g.cumcount() + 1).astype(str)
print(df_genes.to_string(index=False))
输出结果:
gene_id
g0
g1_TE1
g1_TE2
g2
g3
g4_TE1
g4_TE2
g4_TE3
✅ 注意事项:
- 该方法严格基于物理顺序连续性,不依赖全局频次统计(即
g1在别处单独出现不会被误标); -
cumcount()默认从 0 开始计数,因此需+1实现TE1起始; - 若需自定义前缀(如
_iso1,_v2),只需修改字符串拼接部分; - 对超大数据集,此方案完全向量化,性能远优于
for循环或apply。
总结:借助 shift+ne+cumsum 构建连续组,再结合 transform 与 cumcount 实现精准、高效、可扩展的序号别名注入,是处理此类“局部连续编号”问题的标准范式。










