计算我在数据框行中的单词列表的出现总数

时间:2019-05-31 15:40:28

标签: python regex python-3.x

我想计算每行给定数据框列中列表单词的出现次数。

代码:

 d2 = {}
 for key, lst in dict_.items():
    col_names = [element for element in lst if isinstance(element, str)]
    regex_lists = [element for element in lst if isinstance(element, list)]
    regex_list = functools.reduce(lambda x, y: x+y, regex_lists)
    map_function = lambda s: len(re.findall(r'|'.join(regex_list).lower(),  str(s).lower()))
   df_regex_count = df[col_names].applymap(map_function)
   df[key] = [sum(lst_tmp) for lst_tmp in    df_regex_count.values.tolist()]

我的数据框是:

 d = {'Column_1': ['mango juice pret Orange No manner  Emman snow', ' préts No  scan eblanc'],}
 df = pd.DataFrame(data=d)

我的单词表

list_1 = ['mango juice', 'Mango' ,'Orange', 'pr[éeêè]t[s]?']
dict = {"s1": ['Column_1', list_1]}

s1的输出为[3,1],但必须为[4,1]。因为“芒果汁”,芒果,橙色,漂亮

1 个答案:

答案 0 :(得分:0)

re.findall返回字符串中某个模式的所有非重叠匹配。
这意味着在模式中搜索匹配项时会消耗字符串。因此,如果匹配项的子字符串本身就是匹配项,则会被忽略。

在您的情况下,'mango''mango juice'会发生这种情况,因为您的正则表达式将所有字符串与or进行匹配。

如果要查找重叠的大小写,请不要在正则表达式中将要搜索的单词与|组合在一起,而是对每个单词执行搜索。

def map_function(s, reglst):
    matches = [len(re.findall(rg.lower(), s.lower())) for rg in reglst]
    return sum(matches)

在这里,我重新定义了您的map_function。它使用列表推导对re.findall的每个单词执行一次regex_list,并返回所有出现的总和。

那么您的代码将是:

for key, lst in dict_.items():
    col_names = [element for element in lst if isinstance(element, str)]
    regex_lists = [element for element in lst if isinstance(element, list)]
    regex_list = functools.reduce(lambda x, y: x+y, regex_lists)
    df_regex_count = df[col_names].applymap(lambda s : map_function(s, regex_list))
    df[key] = [sum(lst_tmp) for lst_tmp in df_regex_count.values.tolist()]

现在df秒:

                                        Column_1  s1
0  mango juice pret Orange No manner  Emman snow   4
1                          préts No  scan eblanc   1