
本文介绍使用 Pandas 对 DataFrame 中连续出现的相同值(如基因名)自动添加 _TE1、_TE2 等递增别名的方法,仅对连续重复项生效,孤立唯一值保持不变。
本文介绍使用 pandas 对 dataframe 中连续出现的相同值(如基因名)自动添加 `_te1`、`_te2` 等递增别名的方法,仅对连续重复项生效,孤立唯一值保持不变。
在生物信息学或序列数据分析中,常需区分同一标识符(如 gene_id)的连续重复出现——例如将连续的 'g1' 标记为 'g1_TE1'、'g1_TE2',而跳过非连续重复或单次出现的条目。这不同于全局去重或简单计数,关键在于识别“连续块”(consecutive blocks)并为每块内元素编号。
核心思路是三步走:
-
划分连续组:利用
Series.ne(Series.shift())找出值变化的位置,再通过.cumsum()生成唯一组 ID; -
筛选需标记的组:用
groupby.transform('size').gt(1)标记长度 >1 的连续组; -
生成序号后缀:对符合条件的组调用
.cumcount().add(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)
# 步骤分解(推荐一次性执行)
s = df_genes['gene_id']
group = s.ne(s.shift()).cumsum() # 连续组标识
g = s.groupby(group)
m = g.transform('size') > 1 # 布尔掩码:True 表示该行属于长度≥2的连续块
# 原地更新:仅对连续重复块中的行追加后缀
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若在索引 1–2 连续出现则编号,即使后面索引 10 处还有g1也不影响); -
cumcount()默认从 0 开始,因此需+1实现TE1起始; - 使用
loc[m, ...]确保只修改目标行,避免 SettingWithCopyWarning; - 若需自定义前缀(如
_iso1)或格式(如TE001),可将astype(str)替换为.map('{:03d}'.format)。
此方案高效、向量化、无需循环,适用于百万级数据,是处理序列化重复标注任务的标准实践。

















