基于一两个字段关联行

问题描述 投票:0回答:1

我愿意接受使用 Python、PowerBI 和/或 Excel/VBA 的解决方案。

我有一个充满地址和姓名的数据集。一个名称可以与多个地址相关,并且一个地址也可以有多个名称相关。

示例数据集:

地址 姓名
123 XYZ 约翰·史密斯
123 XYZ 格雷格·琼斯
456ABC 格雷格·琼斯
456ABC 鲍勃·杰克逊
789防御 凯伦·约翰逊

所需解决方案:

我正在寻找一种方法来关联在某种程度上共享地址或名称的行。例如,John Smith 显然与 Greg Jones 相关,因为他们共享 123 XYZ 地址,但在二级级别,John Smith 通过 Greg Jones 与 Bob Jackson 相关,因为 Bob 和 Greg 共享 456 ABC 地址。我想为每组关系分配一个唯一的 ID - 因此 John、Greg 和 Bob 都将使用该字段进行关联,而 Karen 则不会。

输出示例:

地址 姓名 关系ID
123 XYZ 约翰·史密斯 1
123 XYZ 格雷格·琼斯 1
456ABC 格雷格·琼斯 1
456ABC 鲍勃·杰克逊 1
789防御 凯伦·约翰逊 2

感谢这里的任何帮助!

python excel powerbi relationship
1个回答
0
投票

这里有一个使用 Python 的快速解决方案:

打开数据集(作为 CSV 文件)并将其转换为字典列表后,我使用集合和条件来解释第一级和第二级关系,并为每一行赋予一个新属性 - “relationship_id”。

import csv

with open("data_in.csv", "r", encoding="utf-8") as file:
    dataset = list(csv.DictReader(file))

    addresses = set()
    names = set()

    relationship_id = 0
    for row in dataset:
        address = row["address"]
        name = row["name"]
    
        if name not in names and address not in addresses:
            relationship_id += 1
    
        if address not in addresses:
            addresses.add(address)
        
        if address not in names:
            names.add(name)
    
        row["relationship_id"] = relationship_id

然后您可以随心所欲地使用此列表。如果您想再次将更新的行转换为 CSV 文件,您可以执行以下操作:

with open("data_out.csv", "w", encoding="utf-8", newline="") as file:
    fieldnames = ["address", "name", "relationship_id"]
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    for row in dataset:
        writer.writerow(row)
© www.soinside.com 2019 - 2024. All rights reserved.