搜索多个字符串的大数据集

时间:2011-08-25 21:14:19

标签: python excel search large-data-volumes

我正在处理两组数据:

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

我需要搜索第2组第2列中的第1组中的字符串,并标记(或隔离)第2组中至少有1个匹配的所有行。命中也需要非常具体(即,我想抓住“杰克有一个网球”但不是“我喜欢杰克有一个网球球袋”)。如果它有帮助,我可以弄清楚我需要特别避免的所有字符串。

我开始使用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

在这种情况下,我会搜索“AUTISM SPECTRUM DISORDER”一词,我想要ID 2344而不是ID 7869.

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

不确定如何保存集合,但不知何故,你必须在某些python数据结构中转换/导入它们。似乎一个非常简单的方法是在一个python集(或列表)中保存set1,在一个dict中保存set2,其中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是值。因此,“严格”的字符串查询应该产生所有期望的ID ...实现留给读者:)

答案 1 :(得分:0)

如果您只想与Set 1完全匹配,可以使用查找执行此操作。 在第2组第3列的第1行输入此公式,其中SET1是SET1的范围地址 = IF(ISERROR(MATCH($ A1,SET1,0), “小姐”, “命中”) 然后将公式复制30000行(双击单元格东南角的litle black sqaure)。 (如果您可以对Set 1进行排序,还有一个更有效的变体)