Как посчитать сумму вхождений моего списка слов в строке данных? - PullRequest
1 голос
/ 31 мая 2019

Я хочу подсчитать вхождения слов моего списка в заданный столбец данных для каждой строки.

Код:

 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].Потому что «сок манго», манго, апельсин, прет

словарь

Создание списков для файла CSV.

df['Word'] = r'\b' + df[' Word'].astype(str) + r'\b'
df.groupby('Country').agg(",".join).reset_index()
group1 =df[df['Country']== 1]
list1.append("|".join(group1['Word']))

ListWithout('|').

1 Ответ

0 голосов
/ 01 июня 2019

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

EDIT

Ваш список регулярных выражений list1 должен быть примерно таким:

list1 = [r'\bmango juice\b', r'\bMango\b' ,r'\bOrange\b', r'\bpr[éeêè]t[s]?\b']

Итак, список по одному слову на элемент. Глядя на свой код, вы, вероятно, можете создать его следующим образом:

df['Word'] = r'\b' + df[' Word'].astype(str) + r'\b'
df.groupby('Country').agg(",".join).reset_index()
group1 =df[df['Country']== 1]
list1.extend(group1['Word'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...