我愿意接受使用 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 的快速解决方案:
打开数据集(作为 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)