读取文件时的"大坑"(python的scanpy库)

Python
302
0
0
2024-05-30
标签   Python库

之前没有安装scanpy库,可以进行如下操作进行安装:

pip install scanpy -i https://pypi.tuna.tsinghua.edu.cn/simple

如果之前有安装过了,就不必在进行安装了!

"探坑"

单细胞实例数据txt文件的下载地址:https://ftp.ncbi.nlm.nih.gov/geo/samples/GSM5101nnn/GSM5101014/suppl/GSM5101014%5FPt1%5FSuperficial%5FCountMatrix.txt.gz

我已经把这个文件下载好了并放在C:/Users/my/Desktop/data目录下,现在开始读取txt文件!

那我们来看看是什么样的一个大坑代码如下:

#导入scanpy库
import scanpy as sc
#读取GSE数据库的单细胞示例数据txt文件
data_1=sc.read_text('C:/Users/my/Desktop/data/GSM5101014_Pt1_Superficial_CountMatrix.txt.gz')
#查看数据
print(data_1)

结果如下:

AnnData object with n_obs × n_vars = 32738 × 2315

表明看上去是不是很正常,没什么奇怪的啊!别急,我们继续往下走:

#读取scanpy的内置数据集pbmc68k_reduced
data_2=sc.datasets.pbmc68k_reduced()
#查看内置数据
print(data_2)

pbmc68k_reduced是一个scanpy开发者已经处理过的示例数据集,我们读取这个数据集后得到的是一个正常的AnnData数据对象,我们可以用它来作为参考

我们查看代码结果的第一行,如下:

AnnData object with n_obs × n_vars = 700 × 765

表明看上去是不是也很正常,没什么奇怪的啊!但是,恭喜你已经成功地不知不觉入坑了,哈哈!

是不是觉得很奇怪,没事,等会你就会看到大坑了。

注意,上面的data_1是我们的从GEO数据库下载并使用read_text()进行读取得到的Anndata数据对象,而data_2是读取scanpy的内置数据后的正常Anndata数据对象,两者不要混淆。

我们先查看正常AnnData数据对象的obs信息,继续往下走:

#先查看正常AnnData数据对象的obs信息
print(data_2.obs)

结果如下:

                      bulk_labels  n_genes  ...  phase  louvain
index                                       ...                
AAAGCCTGGCTAAC-1   CD14+ Monocyte     1003  ...     G1        1
AAATTCGATGCACA-1        Dendritic     1080  ...      S        1
AACACGTGGTCTTT-1         CD56+ NK     1228  ...     G1        3
AAGTGCACGTGCTA-1  CD4+/CD25 T Reg     1007  ...    G2M        9
ACACGAACGGAGTG-1        Dendritic     1178  ...     G1        2
                           ...      ...  ...    ...      ...
TGGCACCTCCAACA-8        Dendritic     1166  ...     G1        2
TGTGAGTGCTTTAC-8        Dendritic     1014  ...     G1        1
TGTTACTGGCGATT-8  CD4+/CD25 T Reg     1079  ...      S        0
TTCAGTACCGGGAA-8          CD19+ B     1030  ...      S        4
TTGAGGTGGAGAGC-8        Dendritic     1552  ...     G1        2

可以看出obs是一个关于存储细胞信息的地方,也许这样不太明显,我们再贴一张图进一步说明:

我们看红框这一列,存储所有样本的细胞。

我们再来查看使用**read_text()**读取后的AnnData数据对象的obs信息:

#使用read_text()读取后的AnnData数据对象的obs信息
print(data_1.obs)

结果如下:

这时,聪明的你是不是已经发现了不同之处,恭喜你,已经看到了大坑,我们看红框里面的字样,这不就是一个个基因名称,基因信息怎么保存到存储细胞信息的地方了呀!

我们再查看正常AnnData数据对象的var信息,继续往下走:

#查看正常AnnData数据对象的var信息
print(data_2.var)

结果如下:

            n_counts     means  dispersions  dispersions_norm  highly_variable
index                                                                         
HES4     1153.387451  0.592365     2.028047          2.771764             True
TNFRSF4   304.358154  0.193332     1.760724          2.746426             True
SSU72    2530.272705  1.019981     1.208284         -0.631160            False
PARK7    7451.664062  1.828078     1.288261         -0.544716            False
RBP7      272.811035  0.174943     1.842789          3.192285             True
              ...       ...          ...               ...              ...
SUMO3    2008.512939  0.878592     1.412841          0.174762            False
ITGB2    7413.487793  1.823767     1.596550         -0.137714            False
S100B     645.737549  0.373296     2.331789          5.554084             True
PRMT2    2062.443848  0.894168     1.273153         -0.375588            False
MT-ND3   1214.914185  0.615929     1.265916         -0.326537            False

可以看出var是一个关于存储基因信息的地方,也许这样不太明显,我们再贴一张图进一步说明:

我们看这两个红框,可以看出var存储的是有关基因的信息

我们再查看使用read_text()读取后的AnnData数据对象的var信息,继续往下走:

#使用read_text()读取后的AnnData数据对象的var信息
print(data_1.var)

结果如下:

是不是有点怪呀?用来存储基因信息的地方却来存储细胞信息,这不是颠倒黑白吗?

我们进入官网的read_text()查看有没有相关介绍,地址:https://scanpy.readthedocs.io/en/latest/generated/scanpy.read_text.html#scanpy.read_text,经过一番查找,没有相关具体信息说明呀!如果有知道的小伙伴,可以在留言区告诉下,在此谢过!

总结

正常AnnData数据对象的obs用来存储细胞信息var用来存储基因信息。在使用scanpy的read_text()进行读取txt文件时,要注意了哦!你已经入坑了,这个函数会使用obs来存储基因信息,而用var来存储细胞信息,而造成阴阳颠倒,如果你使用这个颠倒的AnnData数据对象去进行后续的数据分析,那各种麻烦也会随之而来。

注意:如果你使用的scanpy的其他的读取文件函数进行读取不同格式的文件,一定要小心了哦,一定要查看读取后Anndata的obs是不是存储细胞信息,var是不是存储基因信息!

"填坑"

如果你也使用scanpy的read_text()这个函数来读取txt文件,或使用scanpy别的读文件函数读取别的格式文件,读取后的AnnData也出现上述的这种情况,别慌!既然有坑,当然要填坑了,继续往下走:

#填坑补救措施
data_1=data_1.T

这时的data_1就变成了一个正常的AnnData数据对象了。不信,我们可以查看一下它的obs,继续往下走:

print(data_1.obs)

结果如下:

Columns: []
Index: [AAACCTGAGCGTTTAC-1, AAACCTGCAATCGGTT-1, AAACCTGCATACCATG-1, AAACCTGGTTCCACGG-1, AAACCTGTCACATGCA-1, AAACCTGTCACGCGGT-1, AAACCTGTCCAATGGT-1, AAACCTGTCCCTAACC-1, AAACGGGAGAGTACCG-1, AAACGGGAGCGATTCT-1, AAACGGGAGTCTCAAC-1, AAACGGGCATGCAACT-1, AAACGGGTCCGCAGTG-1, AAACGGGTCTAAGCCA-1, AAAGATGAGCAGACTG-1, AAAGATGAGTACGTAA-1, AAAGATGCATGCCTAA-1, AAAGATGGTTCAGTAC-1, AAAGCAAAGCATGGCA-1, AAAGCAAAGGCCCGTT-1, AAAGCAAGTCGACTAT-1, AAAGCAAGTTACGTCA-1, AAAGCAAGTTATGCGT-1, AAAGTAGAGACAATAC-1, AAAGTAGAGTGCGTGA-1, AAAGTAGCATCCGGGT-1, AAAGTAGTCAACGAAA-1, AAAGTAGTCGGAAACG-1, AAATGCCAGTCCGGTC-1, AAATGCCGTCCGTTAA-1, AAATGCCGTGTGCCTG-1, AAATGCCTCGAACGGA-1, AAATGCCTCGCCATAA-1, AACACGTAGAGTGACC-1, AACACGTAGTCGAGTG-1, AACACGTGTATCGCAT-1, AACCATGAGCCCAGCT-1, AACGTTGAGACAAAGG-1, AACGTTGAGACACGAC-1, AACGTTGCACAAGCCC-1, AACGTTGGTAGGACAC-1, AACGTTGGTAGGGACT-1, AACGTTGGTCTTCAAG-1, AACTCAGCAATAGAGT-1, AACTCAGCAGATAATG-1, AACTCAGGTCAGATAA-1, AACTCAGGTGCAGACA-1, AACTCCCAGAAGCCCA-1, AACTCCCAGACTAGAT-1, AACTCTTAGTGCGATG-1, AACTCTTCAGCTTCGG-1, AACTCTTCAGGACCCT-1, AACTCTTGTCAATGTC-1, AACTCTTGTGTAAGTA-1, AACTGGTAGATCCCAT-1, AACTGGTTCGTCGTTC-1, AACTGGTTCTAACGGT-1, AACTTTCAGAAACGCC-1, AACTTTCAGGGAACGG-1, AACTTTCAGTTAGGTA-1, AACTTTCGTGGACGAT-1, AACTTTCTCATCTGCC-1, AAGACCTAGATAGGAG-1, AAGACCTAGGCACATG-1, AAGACCTCAAGCCCAC-1, AAGACCTGTAGCTCCG-1, AAGACCTTCTACTCAT-1, AAGCCGCGTGAGCGAT-1, AAGCCGCTCGGAGGTA-1, AAGGAGCTCCAAAGTC-1, AAGGCAGGTAAATGAC-1, AAGGCAGGTACCCAAT-1, AAGGCAGGTACTCTCC-1, AAGGCAGGTGAGTATA-1, AAGGTTCAGAGGTACC-1, AAGGTTCAGGATCGCA-1, AAGGTTCGTTACAGAA-1, AAGGTTCGTTGCCTCT-1, AAGGTTCTCCGAGCCA-1, AAGTCTGAGCGTCAAG-1, AAGTCTGCATCGATGT-1, AAGTCTGGTGAACCTT-1, AATCCAGAGGTTACCT-1, AATCCAGAGTCAAGGC-1, AATCCAGCAGACTCGC-1, AATCCAGGTCCGTGAC-1, AATCCAGTCCGCGCAA-1, AATCCAGTCTCAAGTG-1, AATCGGTCAAGTCATC-1, AATCGGTCACGAAGCA-1, AATCGGTCATCCCACT-1, AATCGGTGTCTTCTCG-1, AATCGGTGTTCAGGCC-1, ACACCAAAGTGATCGG-1, ACACCAATCCATGAGT-1, ACACCAATCGCATGGC-1, ACACCAATCGGAAATA-1, ACACCCTAGGCTAGCA-1, ACACCCTAGTGTACGG-1, ACACCCTCACGTGAGA-1, ...]

可以看出obs存储的都是细胞信息

我们再来查看它的var信息,继续往下走:

print(data_1.var)

结果如下:

Columns: []
Index: [MIR1302-10, FAM138A, OR4F5, RP11-34P13.7, RP11-34P13.8, AL627309.1, RP11-34P13.14, RP11-34P13.9, AP006222.2, RP4-669L17.10, OR4F29, RP4-669L17.2, RP5-857K21.15, RP5-857K21.1, RP5-857K21.2, RP5-857K21.3, RP5-857K21.4, RP5-857K21.5, OR4F16, RP11-206L10.3, RP11-206L10.5, RP11-206L10.4, RP11-206L10.2, RP11-206L10.9, AL669831.1, FAM87B, LINC00115, FAM41C, AL645608.2, RP11-54O7.16, RP11-54O7.1, RP11-54O7.2, RP11-54O7.3, SAMD11, AL645608.1, NOC2L, KLHL17, PLEKHN1, C1orf170, RP11-54O7.17, HES4, RP11-54O7.11, ISG15, AGRN, RP11-54O7.18, RNF223, C1orf159, RP11-465B22.5, RP11-465B22.8, TTLL10-AS1, TTLL10, TNFRSF18, TNFRSF4, SDF4, B3GALT6, FAM132A, RP5-902P8.12, UBE2J2, RP5-902P8.10, SCNN1D, ACAP3, PUSL1, CPSF3L, GLTPD1, TAS1R3, DVL1, MXRA8, AURKAIP1, CCNL2, RP4-758J18.2, MRPL20, RP4-758J18.13, ANKRD65, RP4-758J18.7, TMEM88B, RP4-758J18.10, VWA1, ATAD3C, ATAD3B, ATAD3A, TMEM240, SSU72, AL645728.1, C1orf233, RP11-345P4.9, MIB2, MMP23B, CDK11B, RP11-345P4.10, SLC35E2B, RP11-345P4.7, CDK11A, SLC35E2, NADK, GNB1, RP1-140A9.1, CALML6, TMEM52, C1orf222, RP11-547D24.1, ...]

可以看出var存储的都是基因信息

哈哈,我们通过"补救措施"把它变成了一个正常的AnnData数据对象了。

如果你在使用scanpy的读文件函数要注意哦,一定要先查看obs和var存储的是什么!如果出现我们所述的这种情况,可以通过"填坑补救措施",把它变成一个正常AnnData数据对象哦!

我是一只单细胞小菜鸡,如果有哪些地方讲的不好或做的不好,欢迎在下方留言批评指出和纠正!您的指正是我们更新和完善的动力源泉!