我有一些非常奇怪的问题。我有一个脚本获取一个JSON文件,其中包含我之后的一些信息,基因名称更具体。我只想把它作为一个字符串来处理它,它工作得很好,直到我想要用另一个基因列表过滤得到的基因列表(即我只对基因感兴趣)另一个基因列表[文件B]中的JSON文件[文件A])。这是我的剧本:
import urllib
import pandas as pd
pathway = ['hsa04630', 'JAK-STAT']
# Read JSON pathway data from KEGG via TogoWS REST service
link = 'http://togows.dbcls.jp/entry/pathway/' + pathway[0] + '/genes.json'
file = urllib.request.urlopen(link)
data = pd.DataFrame(file.readlines())
# Remove first and last two lines (does not contain data)
data = data.drop(data.index[[0, 1, -2, -1]])
def get_genes(string):
""" Takes a JSON string and finds the gene ID """
gene = str(string[0]).split(':')[1].split(';')[0].replace('"', '')
return gene
# Filter for gene ID
data = pd.DataFrame(data.apply(get_genes, axis=1), columns=['Gene']).sort(
'Gene')
# Filter for EGFR Core gene list
filter = pd.DataFrame(pd.read_excel('../../Gene lists/Gene lists.xlsx',
sheetname='EGFR Core')['Gene'])
filtered = filter.merge(data, on='Gene')
print(filtered)
之前我以这种方式使用过merge
,所以当filtered
数据帧返回为空时我感到非常惊讶。我已经手动检查了两个不同文件中是否有共同的基因,所以应该没问题。我想知道它不起作用的原因是因为我在gen_genes
函数中做了一些奇怪的事情,即使用字符串。
这里是另一个基因列表[文件B]的占位符,其中包含我手动检查的一些基因,以防您想要运行我的脚本。我用这个列表替换了原始的[文件B],得到了相同的结果。
filter = pd.DataFrame(['BRAF','KRAS','EGF','EGFR'], columns=['Gene'])
有人可以帮忙吗?
答案 0 :(得分:3)
如果你看一下data
:
In [10]: data.iloc[0,0]
Out[10]: ' AKT1'
你会注意到字符串的开头还有一个空格,这就是没有任何东西匹配的原因
一种可能的解决方案是将.strip()
添加到get_genes
函数:
def get_genes(string):
""" Takes a JSON string and finds the gene ID """
gene = str(string[0]).split(':')[1].split(';')[0].replace('"', '').strip()
return gene