如何在使用tqdm进度映射时使用pandas.Series.str.contains?

3

我正在尝试根据另一个数据框(dfB)的值向数据框(dfA)添加新列:

最初的回答:

s = dfA['value'].tolist() 
dfB['value'] = dfB['text_bod'].str.contains('|'.join(s))

这个设置下能使用 progress_map 吗?

dfB['value'] = dfB['text_bod'].progress_map(func)

或者有其他方法可以实现 tqdm 吗?


使用 FlashText 的替代方法:

注:Original Answer 翻译为“最初的回答”。
from flashtext import KeywordProcessor

s = dfA['value'].tolist()

processor = KeywordProcessor()
processor.add_keywords_from_list(s)

dfB['value'] = dfB['text_bod'].progress_map(lambda x: processor.extract_keywords(x))
1个回答

2

我不知道有没有str.contains的方法,但是你可以使用progress_map和一个回调函数来完成相同的任务,只不过这个回调函数使用re.search实现:

Original Answer翻译成"最初的回答"

import re
dfB['value'] = dfB['text_bod'].progress_map(
    lambda x: bool(re.search('|'.join(s), x))
)

作为一个函数,你可以使用
def extract(x, p):
    m = p.search(x)
    if m:
        return m.groups(0)
    return np.nan

p = re.compile('|'.join(s))
dfB['value'] = dfB['text_bod'].progress_map(lambda x: extract(x, p))

这应该比lambda更灵活。翻译后的内容:

这样做会比使用lambda更加灵活。


太棒了,我现在就试一下!看起来运行我的测试数据大约需要2个小时。有没有办法让它输出第一个数据框的值,如果不存在则输出NaN,而不是True/False? - undefined
@lauren.he 你是指像这样的代码吗?dfB['text_bod'].progress_map(lambda x: x if re.search('|'.join(s), x) else np.nan) - undefined
啊,我差不多认为这个代码段提供了整个文本主体,其中包含所需的值。我想从 dfA['value'] 中提取单个匹配值,并将其放入 dfB['value'] 中。 - undefined
这似乎是有效的:test['value'] = test['communication_body'].progress_map(lambda x: re.search('|'.join(s), x).group(0) if re.search('|'.join(s), x) else np.nan),但对于多个匹配值,groups(0)不起作用,嗯嗯。 - undefined
我不确定该函数应该如何构建。它是否涉及将re.search('|'.join(s), x)赋值给一个变量? - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接