2014-08-27 3 views
0

У меня возникают некоторые странные проблемы. У меня есть сценарий, который получает JSON-файл, содержащий некоторую информацию, которую я получаю, имена генов более конкретно. У меня была идея просто работать с ним как с строкой, которая отлично работала до тех пор, пока я не дошел до того момента, когда я хотел отфильтровать полученный список генов с другим списком генов (т.е. меня интересуют только гены в JSON файл [файл A], которые находятся в другом списке генов [файл B]). Это мой сценарий:Pandas: слияние двух серий

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 dataframe возвращается как пустой. Я вручную проверил, что в двух разных файлах есть общие гены, поэтому это не должно быть проблемой. Мне интересно, причина в том, что он не работает, потому что я делаю что-то странное в функции 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

Смежные вопросы