解决AttributeError: 'str'对象无'cat'属性及基因符号去重问题
问题:DataFrame基因符号合并去重报错修复与需求实现
需求说明
针对DataFrame中索引为GENE_SYMBOLS的行,合并所有行的内容,将逗号(,)、短横线(-)分割后的基因符号去重,保留唯一值。
原代码
geneset = pd.read_csv("genesets.v2023.1.Hs.tsv", sep="\t", index_col=0) geneset = geneset.loc["GENE_SYMBOLS"] # retrieve only rows with index name "GENE_SYMBOLS" for i in geneset.columns: genes = i.cat(sep=',').tolist() # Merge all the rows of strings with "," delimiter and store as a list genes = genes.split(",") # split by the "," delimiter genes = genes.split("-") # or the "-" delimiter genes = genes.unique() # Keep only if not duplicated
报错信息
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Input In [46], in <cell line: 3>() 2 geneset = geneset.loc["GENE_SYMBOLS"] # retrieve only rows with index name "GENE_SYMBOLS" 3 for i in geneset.columns: ----> 4 genes = i.cat(sep=',').tolist() # Merge all the rows of strings with "," delimiter and store as a list 5 genes = genes.split(",") # split by the "," delimiter 6 genes = genes.split("-") # or the "-" delimiter AttributeError: 'str' object has no attribute 'cat'
输入数据表格
| STANDARD_NAME | DEURIG_T_CELL_PROLYMPHOCYTIC_LEUKEMIA_UP |
|---|---|
| SYSTEMATIC_NAME | M16431 |
| GENE_SYMBOLS | DDR1,CYP2A6,DTX2P1-UPK3BP1-PMS2P11,MARCKSL1 |
| SYSTEMATIC_NAME | M16432 |
| GENE_SYMBOLS | CCL5,IK,ARL6IP5,EIF1AX,PFKP,PJA2,DDR1 |
| SYSTEMATIC_NAME | M16433 |
| GENE_SYMBOLS | PJA2,TLR4,GPNMB,TAGLN,COL1A1,CARMN,CD63 |
期望输出
genes = ['DDR1','CYP2A6','DTX2P1', 'UPK3BP1', 'PMS2P11','MARCKSL1', 'CCL5','IK','ARL6IP5','EIF1AX','PFKP','PJA2', 'TLR4','GPNMB','TAGLN','COL1A1','CARMN','CD63']
修正方案
错误原因
geneset.loc["GENE_SYMBOLS"]返回的是Series,遍历geneset.columns拿到的是列名字符串,字符串没有cat方法,导致报错。- 拆分逻辑错误:
split("-")无法直接对列表调用,需分层处理逗号和短横线的拆分。 unique()是numpy/pandas对象的方法,普通列表不能直接调用。
修正代码
import pandas as pd # 读取TSV数据 geneset = pd.read_csv("genesets.v2023.1.Hs.tsv", sep="\t", index_col=0) # 提取所有GENE_SYMBOLS行的内容为列表 gene_rows = geneset.loc["GENE_SYMBOLS"].tolist() # 合并所有行的基因字符串 combined_genes = ','.join(gene_rows) # 先按逗号拆分得到初步基因列表 comma_split_genes = combined_genes.split(',') # 遍历处理短横线拆分,收集所有基因 all_genes = [] for gene_item in comma_split_genes: all_genes.extend(gene_item.split('-')) # 去重并保留原始出现顺序 unique_genes = list(dict.fromkeys(all_genes)) print(unique_genes)
代码说明
- 直接提取
GENE_SYMBOLS对应的所有值为列表,用','.join()合并成完整字符串。 - 先按逗号拆分得到基础基因项,再逐个处理每个项的短横线拆分,扩展到总列表。
- 使用
dict.fromkeys()实现去重并保留元素原始顺序,若无需顺序可直接用list(set(all_genes))。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

