2015-09-12 5 views
0

У меня есть соответствующая проблема, которую я пытался решить, но не нашел способ сделать это. Я новичок в 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' 

Я знаю, что это ужасно читать, но я только начинаю. (. Все комментарии приветствуются)

Вопросы являются:

  1. Lastname коротка, поэтому матч в список лиц, может быть простым is 'a' in 'b', но я ожидаю, что названия компании в пределах Person1 .. .N, чтобы иметь опечатки или идиосинкразии (подумайте «C-SPAN» и «CSPAN» как возможные версии одного имени).
  2. Число столбцов для людей статично. То есть он исправлен (хотя многие записи будут пустыми, так что, если число столбцов фиксировано на 100, некоторые строки будут иметь только 1 или 2 записи).
  3. Форматирование строк 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, но не добился успеха.

ПРИМЕЧАНИЕ. Я не предоставляю здесь образец кода, потому что отказ - это не одна строка или функция. Все, что я предоставляю, будет иметь слишком много вспомогательных проблем, чтобы стоить ваше время, чтобы посмотреть.

+0

Являются ли столбцы person1-3 одинаковыми для каждой строки? Это крайне неэффективный способ хранения данных – JohnE

+0

Спасибо за вопрос. Нет, они не всегда одинаковы. Есть повторы, но это потому, что данные охватывают несколько лет, когда группы меняют членство. –

+0

Хорошо, тогда я думаю, было бы лучше, если бы данные образца показали эти случаи. – JohnE

ответ

0

Формат данных

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

Ваши данные:

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 

То, что я думаю, что это означает:

lastname = ['smith','jones','cook'] 
companies = ['company a','company b'] 
affiliations = {'matt smith':'company a','tom jones':'company b','karen cook':'company c'} 

Как я думаю, он должен быть отформатирован

lastname = ['smith','jones','cook'] 
companies = ['company a','company b'] 
names = {'smith':'matt smith','jones':'tom jones','cook':'karen cook'} 
affiliations = {'matt smith':'company a','tom jones':'company b','karen cook':'company c'} 

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

Идея заключается в том, чтобы обеспечить следующий вывод:

lastname ... persontype  affiliation 
smith   1    company a 
jones   1    company b 
cook   0    None 

Как получить желаемый результат

Примечание: используется формат, который я думаю, было бы лучше.

print('lastname\tpersontype\taffiliation\n') 
for last in lastname: 
    if last in names: 
     full = names[last] 
     if full in affiliations: 
      comp = affiliations[full] 
      if comp in companies: 
       print(full+'\t1\t'+comp) 
      else: 
       print(full+'\t0\tNone') 
     else: 
      print(full+' is not listed in affiliations.') 
    else: 
     print(last+' has no matches in names.') 
    print('\n') 

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

Если вы хотите распечатать его обратно в файл, это также выполнимо, изучите встроенные функции open() и write().

Надеюсь, это полезно. Наслаждайтесь!

+0

Спасибо TON за это; ваше разъяснение формата чрезвычайно полезно.Единственное, что я думаю, что мне не удалось сообщить, что это другое, возможно, из того, что вы отмечаете, является то, что вся запись в 'person1 ... N' является строкой. И это строка, которая не может быть отформатирована одинаково каждый раз (может быть «матовая кузнец директор компании» или «матовый кузнец, дир, компания» или другой, но всегда с «компанией а»), поэтому я и искал нечеткое соответствие. Поэтому я не уверен, как получить это в формате dict, не используя список компаний для поиска строки. Еще раз спасибо! –

+1

split() вернет список слов из строки (удаляет знаки препинания). Используйте как: 'strings = 'это, есть. строка '' then' words = stringings.split() '. Затем вы можете использовать понимание списка или другую технику для извлечения информации для заполнения ваших списков и словарей. –

+0

Для чтения из файла просмотрите функцию 'readlines()'. Он будет обеспечивать удобство обработки строк для каждой строки файла. Затем вы можете использовать 'split()', чтобы разбить эту строку на столбцы. –