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

解决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_NAMEDEURIG_T_CELL_PROLYMPHOCYTIC_LEUKEMIA_UP
SYSTEMATIC_NAMEM16431
GENE_SYMBOLSDDR1,CYP2A6,DTX2P1-UPK3BP1-PMS2P11,MARCKSL1
SYSTEMATIC_NAMEM16432
GENE_SYMBOLSCCL5,IK,ARL6IP5,EIF1AX,PFKP,PJA2,DDR1
SYSTEMATIC_NAMEM16433
GENE_SYMBOLSPJA2,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']

修正方案

错误原因

  1. geneset.loc["GENE_SYMBOLS"]返回的是Series,遍历geneset.columns拿到的是列名字符串,字符串没有cat方法,导致报错。
  2. 拆分逻辑错误:split("-")无法直接对列表调用,需分层处理逗号和短横线的拆分。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:16:00