我想计算每行给定数据框列中列表单词的出现次数。
代码:
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]。因为“芒果汁”,芒果,橙色,漂亮
答案 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