之前没有安装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数据对象哦!
我是一只单细胞小菜鸡,如果有哪些地方讲的不好或做的不好,欢迎在下方留言批评指出和纠正!您的指正是我们更新和完善的动力源泉!