Как сравнить два столбца разных фреймов данных и создать новый - PullRequest
0 голосов
/ 07 октября 2019

Здравствуйте, ребята, я новичок в python. У меня есть два dataframes.One содержит описание лекарств, которое выглядит так:

df1.head(5)

PID  Drug_Admin_Description
1       sodium chloride 0.9% SOLN
2       Nimodipine 30 mg oral
3       Livothirine 20 mg oral
4       Livo tab 112
5       Omega-3 Fatty Acids

В другой таблице есть только названия лекарств, которые выглядят так:

df2.head(5)

Drug_Name 

Sodium chloride 0.5% SOLN
omega-3 Fatty Acids
gentamicin 40 mg/ml soln
amoxilin 123
abcd 12654

Есть ли способ, которым я могу извлечь только те лекарства, которые находятся как в df1, так и в df2. Пример вывода будет выглядеть так:

new_column

Sodium chloride
omega-3

Я пытался использовать регулярные выражения в python, но несмог выяснить, как бы это применить. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Одно из возможных решений:

Чтобы получить имена из столбца DataFrame, определите следующую функцию:

def getNames(src, colName):
    res = src.str.split(r' [\d.%]+ ?', n=1, expand=True).drop(1, 'columns')
    res.set_index(res[0].str.upper(), inplace=True)
    res.index.name = None
    res.columns = [colName]
    return res

Я заметил, что каждое название препарата может содержать «числовую часть"(пробел, последовательность цифр, включая точку или процент символ).

Таким образом, эта функция разбивает каждое имя в этом шаблоне и принимает только первый" сегмент ".

Затем обратите внимание, что существуют различия в верхнем / нижнем регистре, поэтому каждый список имен должен иметь индекс, содержащий одно и то же имя в верхнем регистре (так что будет возможно объединить оба списка имен только в индексе).

Затем вызовите эту функцию для обоих исходных столбцов:

n1 = getNames(df1.Drug_Admin_Description, 'Name')
n2 = getNames(df2.Drug_Name, 'Name2')

И, чтобы получить окончательный результат, выполните:

n1.join(n2, how='inner').drop('Name2', 'columns').reset_index(drop=True)

Существует одна разница по сравнению с желаемойрезультат, а именно Омега-3 жирные кислоты является результатом в полном тексте .

Согласно выбранному критерию это имя содержит без числовой части . Единственная цифра (3) является неотъемлемой частью имени, и после этого места нет цифр. Поэтому я думаю, что в этом случае нечего «отрезать».

1 голос
/ 07 октября 2019

Одной из возможностей было бы использование get_close_matches из библиотеки difflib.

import pandas as pd
import difflib

drug_description = ["sodium chloride 0.9% SOLN","Nimodipine 30 mg oral",
                    "Livothirine 20 mg oral", "Livo tab 112",
                    "Omega-3 Fatty Acids"]

df1 = pd.DataFrame({"Drug_Admin_Description":drug_description})


drug_name = ["Sodium chloride 0.5% SOLN", "omega-3 Fatty Acids",
            "gentamicin 40 mg/ml soln", "amoxilin 123", "abcd 12654"]

df2 = pd.DataFrame({"Drug_Name":drug_name})
# The above code is to create the dataframe with the information you provided



match_list = [] # We will append this list with the drug names that are similar to the drugs in Drug_Admin_description

for drug in df1["Drug_Admin_Description"]:
    match_test = difflib.get_close_matches(drug, drug_name, n=1)
    if len(match_test) == 0: #if the match is less then 60% similarity it will return a blank list
        pass
    else:
        match_list.append(match_test[0]) #we will take the only item in that list and append it to our match list

df3 = pd.DataFrame({"new_column":match_list}) #we will then make a dataframe of the matches.

Вот ссылка на документацию ниже для get_close_matches. Вы можете передать параметр cutoff, чтобы решить, какой процент% вы хотите для каждого слова. https://docs.python.org/2/library/difflib.html#difflib.get_close_matches

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...