【问题标题】:Pandas: merging two series熊猫:合并两个系列
【发布时间】:2014-10-20 17:32:53
【问题描述】:

我遇到了一些真正奇怪的问题。我有一个脚本,它获取一个 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] 的占位符,其中包含我手动检查的一些基因,以防您想运行我的脚本。我用这个列表替换了原来的 [file B],得到了同样的结果。

filter = pd.DataFrame(['BRAF','KRAS','EGF','EGFR'], columns=['Gene'])

有人可以帮忙吗?

【问题讨论】:

    标签: python-3.x pandas merge


    【解决方案1】:

    如果你看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
    

    【讨论】:

    • 它总是那么简单......非常感谢,它做到了!
    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2019-05-27
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多