169 похожих чатов

Подскажите, плиз, как решить вот такую задачу. В столбце first_name

только одно слово. В столбец 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)

17 ответов

23 просмотра
Марк- Автор вопроса

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)

Марк- Автор вопроса

За компом буду, посмотрю)

Марк
def exp_func(string, list): list2 = [] for...

Да, без векторизации тоска полная. Как ни крути, циклы останутся даже после 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

Ilya Shutov
Да, без векторизации тоска полная. Как ни крути, ц...

А data.table с dplyr через dbplyr уже работает без багов и не режется скорость работы движка data.table?

Eva Shelley
А data.table с dplyr через dbplyr уже работает без...

не знаю, предпочитаю простые блюда. data.table более чем хорош сам по себе. не стоит кетчупом забивать.

Марк- Автор вопроса
Ilya Shutov
Да, без векторизации тоска полная. Как ни крути, ц...

Да, очень круто) Но так вышло, что на нынешнем месте работы приходится юзать в основном пайтон

Марк
Да, очень круто) Но так вышло, что на нынешнем мес...

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

Ilya Shutov
не знаю, предпочитаю простые блюда. data.table бол...

Ну, тут в коде используется как раз и то, и то. Давно хочу изучить data.table, но пока руки не доходят, привык к dplyr в биостатистике.

Марк- Автор вопроса
Eva Shelley
Ну, тут в коде используется как раз и то, и то. Да...

Да там вроде если и режется, то незначительно. Если пайпы магритр применять к data.table, я имею в виду.

Eva Shelley
Ну, тут в коде используется как раз и то, и то. Да...

Да там пару часов на прочтение и вперёд, остальное на практике и в режиме q&a

Марк
def exp_func(string, list): list2 = [] for...

поглядел еще немного. в целом, этот вариант не дает ответа про конкретную область совпадения, что сыграло — это не всегда хорошо, но, есс-но, зависит от задачи. возможен альтернативный вариант 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())

Марк- Автор вопроса
Ilya Shutov
поглядел еще немного. в целом, этот вариант не дае...

Большое спасибо) Протесчу на своем датафрейме и скажу

Марк
Большое спасибо) Протесчу на своем датафрейме и ск...

альтернатива работает медленнее. но она и решает чуть больше и читается понятнее.

декораторы же!

Dmitry 🥌 K
декораторы же!

А что декораторы? Они же к функции, а она не нужна. Нужно просто код побенчмарчить. Я ничего хоть немного близкого к такому так и не нашёл https://bench.r-lib.org/index.html

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта