Невозможно перебрать кадр данных pandas, загруженный из табличных данных
Я могу загрузить свои табличные данные в DataFrame, используя scanpy, но мне не хватает, как перебирать их, чтобы получить доступ к выбранным строкам / столбцам.
Это данные геномики одной клетки, где каждая строка представляет собой ген, а каждый столбец представляет собой значение экспрессии для конкретной клетки. И строки, и столбцы имеют метки. Табличные необработанные данные выглядят так:
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 для файла fig1.h5
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])