python - 使用生成器标记记录时保留 ID 引用

标签 python pandas dataframe token generator

我正在尝试使用 pandas 复制 here 中描述的(非常酷的)数据匹配方法。目标是获取记录的组成部分(标记)并用于匹配另一个 df。

我一直在努力弄清楚如何保留源 ID 并与各个 token 相关联。希望这里有人对我如何做到这一点有一个聪明的建议。我搜索了 Stack,但没有找到类似的问题。

这里有一些示例数据和核心代码来说明。这需要一个数据框,标记选择列,生成标记、标记类型和 ID(但 ID 部分不起作用):

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 值,而不是仅为相应的 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 index, record in enumerate(df[source_column]):
                if isinstance(record, float) is False:
                    for token in tokenizer(record):
                        yield (token, key_name, df.iloc[index]['Id'])

关于python - 使用生成器标记记录时保留 ID 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53531540/

相关文章:

python - 尝试将 win32ui 与 pywin32 一起使用给出 : A dynamic link library (DLL) initialization routine failed

python - 将电子邮件消息解析为可读形式的 Python

python - 如何使用pandas使用zstandard压缩parquet文件

python - 如果字符串包含在另一个字符串中,则追加列值

python - 将小部件添加到 qtablewidget pyqt

python - 查找字符串中第一个数字的索引

python - 通过添加行以不同的增量对 Pandas DataFrame 进行插值

python - 将上一行的内容追加到下一行

python - Pandas 中 "!="和 "not_equal"之间的区别

python - 在 python 中对分组的行执行操作