python - 如何根据某些条件合并数据集的行

标签 python python-3.x

我有一个数据表(来自 CSV 文件),我想读入该数据表并使用一些用于合并行的逻辑进行处理。以下是数据示例:

john,john@domain.com,50
john doe,john@domain.com,10
john doe,john.doe@domain.com,100
mary,mary@domain.com,500

此数据表示一个 3 列 4 行的数据表。第 1 列是姓名(“名字”或“名字、姓氏”)、电子邮件地址以及该人拥有的金额。

我的程序的目标是整契约(Contract)一用户的信息。挑战在于确定哪些用户实际上是同一个人。例如,前 3 行是同一个人。这是因为“john doe”有两个电子邮件地址和两个不同的姓名。我如何确定某人是否与另一个人“相同”的逻辑如下:

  1. 如果两个名字的名字和姓氏相同,则他们是同一个人。我们忽略没有姓氏的名字的比较,因为这太模糊了。
  2. 如果两行具有相同的电子邮件地址,则表明是同一个人。即使名称不同也没关系。

比较的优先级应该是:

  1. 首先匹配名称
  2. 其次匹配电子邮件地址

当我们整合时,我们需要跟踪:

  1. 一个人有多个名字
  2. 一个人有多个已知的电子邮件地址
  3. 他们拥有的总金额

因此,如果我根据上面的数据集迭代地解决这个问题,第一次迭代(按名称合并)会产生以下结果:

Name      | Email(s)                             | Money
-----------------------------------------------------------
john      | john@domain.com                      | 50
john doe  | john@domain.com, john.doe@domain.com | 110
mary      | mary@domain.com                      | 500

第二次迭代,通过电子邮件进行整合,产生了最终结果:

Name(s)         | Email(s)                             | Money
-----------------------------------------------------------
john doe, john  | john@domain.com, john.doe@domain.com | 160
mary            | mary@domain.com                      | 500

我想编写一个 Python 3 脚本来执行这种类型的数据合并。我尝试过各种尝试,但总是变得非常糟糕。我最终得到了大量的嵌套循环或列表理解。我还没有完成任何工作,所以遗憾的是我没有任何东西可以分享。

我的直觉是,有一个Python风格的单行或两行代码可以做到这一点。

最佳答案

一个简单的方法是创建一个包含 ID、姓名、电子邮件和金钱的字典。对于每一行,搜索姓名或电子邮件是否已在字典中。如果是,则更新字典,否则使用新的 id 将名称 email 添加到字典中。 代码如下所示:

data_dict = {'1':{'Names':['john doe', 'john'], 'Emails':['john.doe@domain.com'], 'Money':0},
             '2':{'Names':['mary'], 'Emails':['mary@domain.com'], 'Money':0}
             }
for name in df[name]:
    for key in data_dict:
        if name in data_dict[key]['Names']:
            #update data_dict
        else:
           # add to data_dict

关于python - 如何根据某些条件合并数据集的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57827457/

相关文章:

python - 将重音字符转换为拉丁字符而不影响 ElementTree

python - Python 中的一个奇怪事件

python - 在 Google 自定义搜索 API 中从搜索结果中排除多个字词

python - bytearray 的二进制反转值

python - 无法通过Python发送电子邮件

python - 以指定格式填充缺失值——Python

python - 自定义断言是否需要 'pass' 语句?

python - 我如何从另一个 python 脚本中获取导入

python - 如何使用 BeautifulSoup 保存页面中的所有图像?

python - 如何让 python 3.x 在网络浏览器中输入文本