Я пытаюсь продублировать (очень крутой) подход к сопоставлению данных, описанный здесь , используя панд.Цель состоит в том, чтобы взять составные части (токены) записи и использовать их для сопоставления с другим df.
Я застрял, пытаясь понять, как сохранить идентификатор источника и связать его с отдельными токенами.Надеюсь, у кого-то здесь есть умное предложение, как я могу это сделать.Я искал в стеке, но не смог найти похожий вопрос.
Вот некоторые примеры данных и основной код для иллюстрации.Это берет фрейм данных, токенизирует выбранные столбцы, генерирует токен, тип токена и идентификатор (но часть идентификатора не работает):
d = {'Id': [3,6], 'Org_Name': ['Acme Co Inc.', 'Buy Cats Here LLC'], 'Address': ['123 Hammond Lane', 'Washington, DC 20456']}
df = pd.DataFrame(data=d)
def tokenize_name(name):
if isinstance(name, basestring) is True:
clean_name = ''.join(c if c.isalnum() else ' ' for c in name)
return clean_name.lower().split()
else:
return name
def tokenize_address(address):
if isinstance(address, basestring) is True:
clean_name = ''.join(c if c.isalnum() else ' ' for c in address)
return clean_name.lower().split()
else:
return address
left_tokenizers = [
('Org_Name', 'name_tokens', tokenize_name),
('Address', 'address_tokens', tokenize_address)
]
#this works except for ID references
def prepare_join_keys(df, tokenizers):
for source_column, key_name, tokenizer in tokenizers:
for index in df.index:
if source_column in df.columns:
for record in df[source_column]:
if isinstance(record, float) is False:
for token in tokenizer(record):
yield (token, key_name, df.iloc[index]['Id'])
for item in prepare_join_keys(df, left_tokenizers):
print item
Этот код выдает правильные токены, но выдает значения Id для ВСЕХ токенов вместотолько соответствующее значение идентификатора.Я знаю, что у меня здесь не так, но я не могу придумать, как это сделать, используя функцию генератора.Желаемый результат будет:
acme, name_tokens, 3
co, name_tokens, 3
inc, name_tokens, 3
buy, name_tokens, 6
cats, name_tokens, 6
here, name_tokens, 6
llc, name_tokens, 6
123, address_tokens, 3
hammond, address_tokens, 3
etc.