excel 基于一个或两个字段关联行

3phpmpom  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(100)

我对使用Python,PowerBI和/或Excel/VBA的解决方案持开放态度。
我有一个地址和名字的数据集。一个名称可以与许多地址相关,并且可以有许多名称与一个地址相关。
示例数据集:
| 姓名、名称| Name |
| --| ------------ |
| 约翰·史密斯| John Smith |
| 格雷格·琼斯| Greg Jones |
| 格雷格·琼斯| Greg Jones |
| 鲍勃·Jackson| Bob Jackson |
| 凯伦·Json| Karen Johnson |
所需解决方案:
我正在寻找一种方法来关联共享某个级别的地址或名称的行。例如,约翰·史密斯与格雷格·琼斯显然相关联,因为他们都共享地址123 XYZ,但在第二层,约翰·史密斯通过格雷格·琼斯与鲍勃·Jackson相关,因为鲍勃和格雷格共享地址456 ABC。我想为每组关系分配一个唯一的ID-这样John、Greg和Bob都将使用该字段关联起来,而Karen则不会。
示例输出:
| 姓名、名称|关系ID| Relationship ID |
| --|--| ------------ |
| 约翰·史密斯|一个| 1 |
| 格雷格·琼斯|一个| 1 |
| 格雷格·琼斯|一个| 1 |
| 鲍勃·Jackson|一个| 1 |
| 凯伦·Json|二个| 2 |
感谢任何帮助在这里!

zvokhttg

zvokhttg1#

下面是一个使用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)

相关问题