Я пытаюсь дублировать (очень классный) подход к описанию данных, описанный здесь, используя pandas. Цель состоит в том, чтобы принять компоненты (токены) записи и использовать их для соответствия другому df.
Я застрял, пытаясь понять, как сохранить исходный идентификатор и связать его с отдельными токенами. Надеюсь, что у кого-то есть умное предложение о том, как я могу это сделать. Я искал Stack, но не смог найти аналогичный вопрос.
Вот несколько примеров данных и основного кода для иллюстрации. Это принимает фрейм данных, токенизирует столбцы выбора, генерирует токен, тип токена и идентификатор (но идентификационная часть не работает):
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 для всех токенов ALL, а не только соответствующее значение 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.
Вам нужно изменить индекс Id
, а не в выделенном for
цикла, но в то же время вы получите новую запись. Я бы предложил что-то вроде:
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 i, record in enumerate(df[source_column]):
if isinstance(record, float) is False:
for token in tokenizer(record):
yield (token, key_name, df.iloc[i]['Id'])