无法迭代从表格数据加载的pandas数据帧

时间:2018-01-18 16:58:09

标签: python pandas dataframe scanpy

我可以使用scanpy将表格数据加载到DataFrame中,但我不知道如何迭代它以访问选定的行/列。

这是单细胞基因组学数据,其中每行是基因,每列是特定细胞的表达值。行和列都有标签。表格原始数据如下所示:

Gene_symbol Cancer--Cell_1  Cancer--Cell_10 Cancer--Cell_100
A2M.AS1 0.0 0.0 0.0
A2MP1   0.0 0.0 0.0
AADACL2 0.0 0.0 0.0
AAGAB   154.561226827488    0.0 0.0
AAR2    295.875190529996    299.455534712676    0.0
AATF    546.792205537953    323.38381204192996  0.0
AATK    0.0 0.0 0.0
AATK.AS1    0.0 0.0 0.0
ABAT    0.0 0.0 0.0

这很容易转换为h5ad,如下所示:

import pandas as pd
import scanpy.api as sc

adata = sc.read('fig1.tab', ext='txt', first_column_names=True).transpose()
adata.write('fig1.h5')

我可以加载它但是无法再次访问它的所有部分。例如,我怎样才能选择两个基因行并获取所有列及其相应的值?如果我只想要某些列怎么办?

我的代码尝试中的注释,输出如下:

adata = sc.read_h5ad('fig1.h5')

# this is for the cancer dataset
selected = adata[:, adata.var_names.isin({'AAR2', 'ECT2'})]

## this line spews information on the columns like:
#  Empty DataFrameView
#  Columns: []
# Index: [Cancer--Cell_1, Cancer--Cell_10, Cancer--Cell_100, Cancer--Cell_1000, Cancer--Cell_1001
print(selected.obs)

## this line gives the row information:
# Empty DataFrameView
# Columns: []
#Index: [AAR2, ECT2]
print(selected.var)

# Nothing happens here at all
#for i, row in selected.obs.iteritems():
#    print(i, row)

for gene_name, row in selected.var.T.iteritems():
    # this prints like: Series([], Name: AAR2, dtype: float64)
    print(row)

    # Nothing happens here
    for cell_name, val in row.iteritems():
        print("{0}\t{1}\t{2}".format(gene_name, cell_name, val))

如果它有用,请点击Dropbox link for the fig1.h5 file

1 个答案:

答案 0 :(得分:1)

您正在迭代每个基因的变量(基因)元数据,而不是数据矩阵。

除了名称之外,您的基因没有任何与之关联的元数据,这些名称存储在var元数据DataFrame的索引中。您现在存储在row变量中的是单个基因的空元数据。

从你的评论中我推断你想要迭代矩阵。你可以这样做:

cx = adata.X.tocoo()    
for cell, gene, value in zip(adata.obs_names[cx.row], adata.var_names[cx.col], cx.data):
    print(cell, gene, value)

这当然只有在你的矩阵稀疏时才有效。

如果密集且您真的想要迭代包括零的每个值,我建议这样做:

for g, gene in enumerate(adata.var_names):
    for c, cell in enumerate(adata.obs_names):
        print(cell, gene, adata.X[c, g])