2014-08-27 110 views
0

我有一些真正奇怪的問題。我有一個腳本可以獲取包含我之後的一些信息的JSON文件,更具體地說是基因名稱。我的想法是將它作爲一個字符串工作,直到我想要用另一個基因列表過濾所得到的基因列表時,它才工作得很好(即,我只對JSON中的基因感興趣文件[文件A]在另一個基因列表[文件B]中)。這是我的腳本:熊貓:合併兩個系列

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']) 

有人可以幫忙嗎?

回答

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 
+0

它總是那麼簡單......非常感謝,也做到了! – Sajber 2014-08-27 09:02:48