только одно слово. В столбец name - неизвестное кол-во слов, разделенных пробелом.
Как сравнить каждое слово из name с first_name, например, создав новый столбец, где будет стоять цифра 1, если хотябы одно слово из name совпадает с first_name?
d = {'first_name': ['Elena', 'Lilija', 'Nadezhda', 'Anna', 'Aleksandr'], 'name': ['A Pokupatel', "Lilija Mel'nikova", "Nadja Marem'janova", "Anja Kondratova", "Aleksandr"]}
df = pd.DataFrame(d)
def exp_func(string, list): list2 = [] for i in list: list2.append(jaro_winkler.distance(string, i)) return np.min(list2) df['splitter'] = df['name'].str.split(' ') df['jaro_winkler_distance_first_name'] = df.apply(lambda x: exp_func(str(x['first_name']), list(x['splitter'])), axis=1)
За компом буду, посмотрю)
Да, без векторизации тоска полная. Как ни крути, циклы останутся даже после explode Еще раз убедился, что R куда лаконичнее, прозрачнее и быстрее. library(tidyverse) library(stringdist) library(data.table) df <- data.frame( first_name = c("Elena", "Lilija", "Nadezhda", "Anna", "Aleksandr"), name = c("A Pokupatel", "Lilija Mel'nikova","Nadja Marem'janova","Anja Kondratova","Aleksandr") ) # решаем df %>% separate_rows(name) %>% mutate(dist = stringdist(first_name, name, method = "jw")) %>% setDT() %>% .[order(dist), head(.SD, 1), by = first_name] ответ first_name name dist <char> <char> <num> 1: Lilija Lilija 0.0000000 2: Aleksandr Aleksandr 0.0000000 3: Anna Anja 0.1666667 4: Nadezhda Nadja 0.2333333 5: Elena Pokupatel 0.5629630
А data.table с dplyr через dbplyr уже работает без багов и не режется скорость работы движка data.table?
не знаю, предпочитаю простые блюда. data.table более чем хорош сам по себе. не стоит кетчупом забивать.
Да, очень круто) Но так вышло, что на нынешнем месте работы приходится юзать в основном пайтон
на вкус и цвет... хотя односолодовый виски куда приятнее текилы. но надо же кому-то кактусы утилизировать.
Ну, тут в коде используется как раз и то, и то. Давно хочу изучить data.table, но пока руки не доходят, привык к dplyr в биостатистике.
Да там вроде если и режется, то незначительно. Если пайпы магритр применять к data.table, я имею в виду.
Да там пару часов на прочтение и вперёд, остальное на практике и в режиме q&a
Вообще никак. Все работает идеально.
поглядел еще немного. в целом, этот вариант не дает ответа про конкретную область совпадения, что сыграло — это не всегда хорошо, но, есс-но, зависит от задачи. возможен альтернативный вариант import pandas as pd import numpy as np import jellyfish import timeit d = {'first_name': ['Elena', 'Lilija', 'Nadezhda', 'Anna', 'Aleksandr'], 'name': ['A Pokupatel', "Lilija Mel'nikova", "Nadja Marem'janova", "Anja Kondratova", "Aleksandr"]} raw_df = pd.DataFrame(d) # решаем df = raw_df.copy().assign(term = raw_df.name.str.split(' ')).explode('term') df['jw_rate'] = [jellyfish.jaro_winkler(x, y) for x, y in zip(df['first_name'], df['term'])] df.sort_values('jw_rate', ascending = False).groupby('first_name').nth(0).reset_index() Но в таких случаях всегда нужно делать бенчмарки и искать баланс между скоростью и читаемостью. Правда такой мелкий вариант на трех строчках совсем непоказателен — накладные на старт могут съесть все время. # тестируем различные варианты testcode_base = ''' df = raw_df.copy() df['splitter'] = df['name'].str.split(' ') df['jaro_winkler_distance_first_name'] = df.apply(lambda x: exp_func(str(x['first_name']), list(x['splitter'])), axis=1) ''' # альтернативный вариант testcode_alt = ''' df = raw_df.copy().assign(term = raw_df.name.str.split(' ')).explode('term') df['jw_rate'] = [jellyfish.jaro_winkler(x, y) for x, y in zip(df['first_name'], df['term'])] # df['jw_rate'] = df.apply(lambda x: jellyfish.jaro_winkler(x['first_name'], x['term']), axis=1) df.sort_values('jw_rate', ascending = False).groupby('first_name').nth(0).reset_index() ''' timeit.timeit(stmt = testcode_base, number = 1000, globals = globals()) timeit.timeit(stmt = testcode_alt, number = 1000, globals = globals())
Большое спасибо) Протесчу на своем датафрейме и скажу
альтернатива работает медленнее. но она и решает чуть больше и читается понятнее.
декораторы же!
А что декораторы? Они же к функции, а она не нужна. Нужно просто код побенчмарчить. Я ничего хоть немного близкого к такому так и не нашёл https://bench.r-lib.org/index.html
Обсуждают сегодня