【问题标题】:Searching large data set for multiple strings在大型数据集中搜索多个字符串
【发布时间】:2011-11-04 01:34:24
【问题描述】:

我正在处理两组数据:

Set 1 在单列中有 500 个成员(所有字符串) 第 2 组在两列(制表符分隔)中有 30,000 个成员,其中第 1 列是数字 ID 号,第 2 列是用 分隔的字符串列表(10,000 种可能性)。

我需要在 Set 2 的第 2 列中搜索 Set 1 中的字符串,并标记(或隔离)Set 2 中至少有 1 个匹配项的所有行。命中也需要非常具体(即,我想抓取“Jake 有一个网球”而不是“我喜欢 Jake 有一个网球包”)。如果有帮助,我可以找出我需要特别避免的所有字符串。

我从 excel ("if(isnumber(search(")) 开始,但发现嵌套 if 语句的数量是有限制的。我使用 grep 也取得了一些成功,但我意识到它是隔离行我特别需要避免的(“我喜欢杰克有一个网球包”类型的线条)。

我开始认为 python 是要走的路,但我不知道如何编码。其他人有什么建议吗?

这是第 2 组中的一个示例(ID 被欺骗以保护匿名),以便更好地了解我正在使用的内容:

1230    DEVELOPMENTAL DELAY, LANGUAGE DELAY, MOTOR DELAY  
2257    MULTIPLE CONGENITAL ANOMALIES  
2344    MICROCEPHALY, AUTISM SPECTRUM DISORDER, SHORT STATURE  
3342    DEVELOPMENTAL DELAY, SEIZURE DISORDER, ATAXIA  
7651    CONGENITAL ANOMALY, UNSPECIFIED  
7869    FAMILY HISTORY OF AUTISM SPECTRUM DISORDER

在这种情况下,我将搜索“自闭症谱系障碍”一词,我想要 ID 2344 但不是 ID 7869。

感谢您的帮助!

【问题讨论】:

    标签: python excel search large-data-volumes


    【解决方案1】:

    不确定你是如何保存你的集合的,但你必须以某种方式将它们转换/导入到一些 python 数据结构中。似乎一个非常简单的方法是将 set1 保存在 python 集合(或列表)中,将 set2 保存在 dict 中,id 作为键,字符串作为值。然后通过键和适当的值搜索进行简单的迭代将产生您想要的结果。这应该足够了

    set1 = set( ... ) # your 500 members must be here 
    set2 = dict( ... ) # your 30000 other ids-strings stuff
    
    # and a simple function to make queries
    
    def handle_query( query_string ):
        for id in set2:
            if query_string in set2[id].split(","):
                yield id   
    
    # now you can call it for every string in set1 (or whatever...)
    
    for string in set1:
        print string, [ i for i in handle_query( string ) ] 
    

    是的,python 是要走的路:)

    但是,这不是最优的(如果数据集较大,则扩展性很差),因为您必须遍历所有 id。这对于 30000 个 id 来说是可以的,但“几乎完美”在于所谓的“倒排索引”,这是搜索引擎的核心概念。因此,在某种意义上“保存”您的 set2 数据的最佳方式是:

    DEVELOPMENTAL DELAY -> 1230, another_id, yet_another_id, ...
    LANGUAGE DELAY -> 1230, ...
    MOTOR DELAY -> 1230, ...
    MULTIPLE CONGENITAL ANOMALIES -> 2257, ...
    etc
    

    现在,字符串是键,(一列)id 是值。所以,“严格”的字符串查询应该产生所有需要的 ids...实现留给读者作为练习:)

    【讨论】:

    • 我希望在 excel 中拼凑一些东西,因为我是一个糟糕的编码员,但这显然是“正确”的做法。非常感谢您花时间解释这一切!
    【解决方案2】:

    如果您只想与 Set 1 完全匹配,您可以通过查找来做到这一点。 在 set 2 的 column3 的第 1 行输入这个公式,其中 SET1 是 SET1 的范围地址 =IF(ISERROR(MATCH($a1,SET1,0),"Miss","Hit") 然后将公式向下复制 30000 行(双击单元格东南角的小黑色方块)。 (如果您可以对 Set 1 进行排序,还有一个更有效的变体)

    【讨论】:

    • 我喜欢这个想法,但我似乎无法让它正常工作——如果设置为 2,它将返回“MISS”,第 2 列包含多个字符串(即,“AUTISM”返回一个“命中”但“自闭症,代谢紊乱”返回“小姐”)。我可以按照我喜欢的任何方式对两组进行排序。什么是更有效的变体?非常感谢您的帮助。
    • MATCH 将一个完整单元格与另一个完整单元格进行比较,因此除非您拆分第 2 组,否则它不会执行您想要的操作(您可以在逗号处拆分吗?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2017-12-02
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多