У меня есть соответствующая проблема, которую я пытался решить, но не нашел способ сделать это. Я новичок в python, поэтому для этого могут быть простые методы. Я искал вопросы, но не нашел ничего, что достало мне то, что мне нужно.В python: как найти совпадение строки в той же строке, сравнить часть строки (нечеткой) в списке?
ЦЕЛЬ
мне нужно определить «тип» лица (будет определено ниже), и если они принадлежат к одному из списка групп, отметьте группу. Результат должен быть одной строкой в кадре данных, который содержит наблюдение за именем человека, его типом и их принадлежностью. Все данные существуют как строки, и есть несколько частей строк, которые мне придется разбирать.
DATA
Мои данные в настоящее время выглядит следующим образом:
lastname person1 person2 person3
smith matt smith, company a tom jones, company b karen cook, company c
jones matt smith, company a tom jones, company b karen cook, company c
cook matt smith, company a tom jones, company b karen cook, company c
Кроме того, у меня есть список компаний
CompanyName
company a
company b
company d
шаги, грубо (в псевдокод-иш), для каждой строки в кадре данных
If lastname is in person1:
if person1 company is in list of CompanyNames:
df['persontype'] = 1 #where 1 indicates being in a listed company
df['affiliation'] = company name #the matched item from CompanyName list
else if lastname is in person2:
if person2 company is in list of CompanyNames:
df['personatype'] = 1
df['affiliation'] = company name
else if lastname is in person3:
if person3 company name is in list of CompanyNames:
df['persontype'] = 1
df['affiliation'] = company name
else:
df['persontype'] = 0 #indicating a person in an unlisted company
df['affiliation'] = 'Unlisted'
Я знаю, что это ужасно читать, но я только начинаю. (. Все комментарии приветствуются)
Вопросы являются:
- Lastname коротка, поэтому матч в список лиц, может быть простым
is 'a' in 'b'
, но я ожидаю, что названия компании в пределах Person1 .. .N, чтобы иметь опечатки или идиосинкразии (подумайте «C-SPAN» и «CSPAN» как возможные версии одного имени). - Число столбцов для людей статично. То есть он исправлен (хотя многие записи будут пустыми, так что, если число столбцов фиксировано на 100, некоторые строки будут иметь только 1 или 2 записи).
- Форматирование строк person1 ... N несовместимо. То есть могут быть несколько запятых, периоды, дефисы и т. Д. Таким образом, разделение на запятую становится все после того, как оно не всегда будет давать название компании.
UPDATE
Благодаря большим вопросов, я понимаю, что я не был достаточно детализирован по формату данных. Записи под столбцами person1..N
сильно различаются. Примеры фактических данных от этих колонок ниже:
person1
Hill, Daniel O., Assistant Administrator for Technology, U.S. Small Business Administration
person2
R&D Credit Coalition, R. Randall Capps
Вот почему я не пытался с помощью .split()
методов сразу. Порядок жетонов неравномерен, у некоторых есть позиция/задание, а также название организации, и имена не всегда находятся в порядке «телефонной книги».
DESIRED РЕЗУЛЬТАТ
То, что я хотел бы закончить это в dataframe с этим (в дополнение ко всем другим столбцам)
lastname ... persontype affiliation
smith 1 company a
jones 1 company b
cook 0 None
Благодаря тонну для каких-либо указателей, наведения, и т.д. . на этом. Я работал с модулем fuzzywuzzy, но не добился успеха.
ПРИМЕЧАНИЕ. Я не предоставляю здесь образец кода, потому что отказ - это не одна строка или функция. Все, что я предоставляю, будет иметь слишком много вспомогательных проблем, чтобы стоить ваше время, чтобы посмотреть.
Являются ли столбцы person1-3 одинаковыми для каждой строки? Это крайне неэффективный способ хранения данных – JohnE
Спасибо за вопрос. Нет, они не всегда одинаковы. Есть повторы, но это потому, что данные охватывают несколько лет, когда группы меняют членство. –
Хорошо, тогда я думаю, было бы лучше, если бы данные образца показали эти случаи. – JohnE