5. 表达矩阵预处理(Python)

第4篇中生成的表达矩阵存在几个问题:

  1. 因为是基于转录本比对,所以“Gene_id”一列会出现一个基因多个转录本的情况;

  2. 存在大量的4组count都为0的基因行。

在python中进行处理:

import pandas as pd

# 读取数据,自动解析多个空格
df = pd.read_csv("merged_counts.txt", sep=r"\s+", engine="python")

print(df.columns)  # 再次检查列名是否正确
print(df[["Gene_id"]].head(10))

Index(['Gene_id', 'BC07', 'BC08', 'BC07_2', 'BC08_2'], dtype='object')
             Gene_id
0  4933401J01Rik-201
1        Gm26206-201
2           Xkr4-203
3           Xkr4-202
4           Xkr4-201
5        Gm18956-201
6        Gm37180-201
7        Gm37363-201
8        Gm37686-201
9         Gm1992-201
df["Gene_id_trimmed"] = df["Gene_id"].str.split("-").str[0]
print(df[["Gene_id", "Gene_id_trimmed"]].head(10))  # 看看是否被截断错误

Gene_id Gene_id_trimmed
0  4933401J01Rik-201   4933401J01Rik
1        Gm26206-201         Gm26206
2           Xkr4-203            Xkr4
3           Xkr4-202            Xkr4
4           Xkr4-201            Xkr4
5        Gm18956-201         Gm18956
6        Gm37180-201         Gm37180
7        Gm37363-201         Gm37363
8        Gm37686-201         Gm37686
9         Gm1992-201          Gm1992
# 仅保留数值列 + 基因 ID
df_numeric = df.drop(columns=["Gene_id"])  # 先去掉原始基因 ID 列

# 按基因 ID 进行合并(去掉后缀),仅合并数值列
df_gene = df_numeric.groupby("Gene_id_trimmed", sort=False).sum()

# 只保留在所有样本中 count 之和大于 0 的基因
df_gene = df_gene[df_gene.sum(axis=1) > 0]

# 保存合并后的数据
df_gene.to_csv("merged_gene_counts.txt", sep="\t")

# 查看前几行
print(df_gene.head())

                   BC07  BC08  BC07_2  BC08_2
Gene_id_trimmed                               
Gm37329                0     1       0       0
Gm38148                0     0       0       2
Gm19938                0     0       0       1
ENSMUST00000371377     0     0       1       0
ENSMUST00000371375     0     0       1       0

这样就生成了我想要的可以进行差异分析的表达矩阵了。其中.groupby("Gene_id_trimmed").sum()会自动合并相同基因 ID 的行,因此不会出现重复的基因行名。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容