Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列(存储集)与字典集和返回号进行比较_Python_Pandas_Dictionary_Set - Fatal编程技术网

Python列(存储集)与字典集和返回号进行比较

Python列(存储集)与字典集和返回号进行比较,python,pandas,dictionary,set,Python,Pandas,Dictionary,Set,在熊猫数据框中有一个超过15毫米的记录列表,我试图确定该字段中包含的唯一有效英语单词的数量 我怎样才能加快速度?比较。我正在使用set.intersect(..),但它需要一个多小时。下面是代码和示例数据 df.info() sys_id float64 grp_id float64 set_id float64 desc object unique_set object 这些记录的唯一键是“*id”字段。 Desc是用户定义的描述 我使用以下代码

在熊猫数据框中有一个超过15毫米的记录列表,我试图确定该字段中包含的唯一有效英语单词的数量

我怎样才能加快速度?比较。我正在使用set.intersect(..),但它需要一个多小时。下面是代码和示例数据

df.info()
sys_id      float64
grp_id      float64
set_id      float64
desc        object
unique_set  object
这些记录的唯一键是“*id”字段。 Desc是用户定义的描述

我使用以下代码创建唯一的_集:

df['unique_set'] = df.data_desc.apply(lambda x: detSet(x))
其中定义了detSet:

def detSet(strDesc):
    if len(str(strDesc)) <= 1:
        # Return an empty set
        return set()
    else:
        # Remove all punctation
        strDesc = strDesc.translate(replace_punctuation).lower()
        # Remove all Non Alphabetic Characters (including Numbers)
        strDesc = re.sub(r'[^a-zA-Z ]', ' ', strDesc)
        # Remove all words less than 4 characters long
        strDesc = re.sub(r'\b\w{1,3}\b','', strDesc)
        # Remove all the extra spaces
        strDesc = ' '.join(strDesc.split())
        #
        return set(strDesc.split())
一些样本数据:

141   9437  13522   {jelly, beans, pudding, cake, fruitc}
787   29575 5915    {ingerbread, sugar, plum, powder, jelly}
842   22909 28065   {pudding, bear, claw, sesame, snaps, m}
484   36065 25069   {isu, cake, candy, canes, ca}
897   54587 48574   {tart, fruitcake, dessert, bisc}
123   48335 36038   {chocolate, icing, marzipan, macaroon, apple}
293   36779 12239   {ars, sugar, plum, cupcake, danish, tiramis}
115   18478 43114   {e, pudding, gummies, chocola}
183   13346 33084   {roll, caramels, candy, fruitcak}
501   94397 47227   {cake, candy, canes, cake}
473   52269 44396   {e, gummi, bears, tiramisu, cake, candy}

首先,您应该创建
ENGLISH_WORDS
作为
集合
,以加快交叉,并从其他列表中筛选出短单词:

ENGLISH_WORDS = {e.lower() for e in ENGLISH_WORDS if len(e)>3}
然后,似乎调用了很多
detSet
方法,并且它进行了大量的字符串操作,这是非常昂贵的

让我们看一下您的原始片段:

def detSet(strDesc):
    ...
    else:
        # Remove all punctation
        strDesc = strDesc.translate(replace_punctuation).lower()
        # Remove all Non Alphabetic Characters (including Numbers)
        strDesc = re.sub(r'[^a-zA-Z ]', ' ', strDesc)
(这是您的原始代码片段)

上面的两行基本上做相同的事情。您只需通过以下操作添加数字的翻译(可能还有其他字符,有待改进):

replace_punctuation.update({i:' ' for i in range(ord('0'),ord('9'))})
创建
replace_标点符号
表时。因此,您可以放弃昂贵的正则表达式替换

一旦你做到了这一点,你已经有了一串空格分隔的单词。这时你应该分开,把小词过滤掉。以及以下三行:

    # Remove all words less than 4 characters long
    strDesc = re.sub(r'\b\w{1,3}\b','', strDesc)
    # Remove all the extra spaces
    strDesc = ' '.join(strDesc.split())
    #
    return set(strDesc.split())
可以作为集合理解直接编写(1个或多个空格:如果在没有任何参数的情况下调用split,则无所谓),因此您不需要创建临时列表(您在代码中创建了很多临时列表)

这应该快得多,因为字符串和正则表达式操作要少得多

总而言之,这里是加速程序的样子:

def detSet(strDesc):
    if len(str(strDesc)) <= 1:
        # Return an empty set
        return set()
    else:
        # Remove all punctation & replace digits by spaces (using the new replace_punctuation table)
        strDesc = strDesc.translate(replace_punctuation).lower()
        # split, filter out small words, and create set comprehension directly
        return {s for s in strDesc.split() if len(s) > 4}
可以简单地(也稍微快一点):


(这同样适用于
df.unique\u set.apply(lambda x:detNumEnglish(x))

我开始怀疑这对代码审查是否更好。。。
return {s for s in strDesc.split() if len(s) > 4}
def detSet(strDesc):
    if len(str(strDesc)) <= 1:
        # Return an empty set
        return set()
    else:
        # Remove all punctation & replace digits by spaces (using the new replace_punctuation table)
        strDesc = strDesc.translate(replace_punctuation).lower()
        # split, filter out small words, and create set comprehension directly
        return {s for s in strDesc.split() if len(s) > 4}
df.data_desc.apply(lambda x: detSet(x))
df.data_desc.apply(detSet)