Pandas: извлечь акроним из подстрок одного столбца и сопоставить его с другим столбцом с условием - PullRequest
1 голос
/ 29 марта 2020

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

pd.DataFrame([['Global Workers Company gwc', 'gwc'], ['YTU', 'your team united']] , columns=['Name1','Name2'])

Желаемый результат:

         Name1                      Name2               Match
0   Global Workers Company gwc           gwc            True
1   YTU                             your team united    True

Я создал лямбда-функцию, чтобы получить только аббревиатуру, но не смог этого сделать

t = 'Global Workers Company gwc'
[x[0] for x in t.split()]

['G', 'W', 'C', 'g']

"".join(word[0][0] for word in test1.Name2.str.split()).upper()

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Вы можете использовать функцию Dataframe.apply вместе с параметром axis=1, чтобы применить пользовательский func к кадру данных. Затем вы можете использовать регулярные выражения для сравнения acronym с соответствующим большим именем или фразой.

Попробуйте это:

import re

def func(x):
    s1 = x["Name1"]
    s2 = x["Name2"]

    acronym = s1 if len(s1) < len(s2) else s2
    fullform = s2 if len(s1) < len(s2) else s1

    fmtstr = ""
    for a in acronym:
        fmtstr += (r"\b" + a + r".*?\b")

    if re.search(fmtstr, fullform, flags=re.IGNORECASE):
        return True
    else:
        return False


df["Match"] = df.apply(func, axis=1)
print(df)

Вывод:

                        Name1             Name2  Match
0  Global Workers Company gwc               gwc   True
1                         YTU  your team united   True
0 голосов
/ 29 марта 2020

Я буду использовать картограф. У нас будет поисковый словарь, который преобразует данные в тот же тип, который мы можем проверить на равенство.

import pandas as pd

#data
df = pd.DataFrame([['Global Workers Company', 'gwc'], ['YTU', 'your team united']] , columns=['Name1','Name2'])


# create a mapper
mapper = {'gwc':'Global Workers Company',
          'YTU': 'your team united'}

def replacer(value, mapper=mapper):
     '''Takes in value and finds its map, 
        if not found return original value
     '''
    return mapper.get(value, value)

# create column checker and assign the equality 
df.assign(
    checker = lambda column: column['Name1'].map(replacer) == column['Name2'].map(replacer)
)

print(df)
...