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

时间:2019-09-06 19:16:21

标签: 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列是姓名(“名字”或“姓氏”),电子邮件地址和该人拥有的金额。

我的程序的目标是合并同一用户的信息。挑战在于确定哪些用户实际上是同一个人。例如,前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脚本。我为此尝试了各种尝试,但总是很讨厌。我最终遇到了大量嵌套循环或列表理解。我还没有任何工作,所以很遗憾我没有什么可分享的。

我的直觉是在某处有一个蟒蛇皮的一线或两线衬垫。

1 个答案:

答案 0 :(得分:0)

一种简单的方法是使用ID,名称,电子邮件和金钱创建字典。并针对每一行搜索名称或电子邮件是否已在词典中。如果是,则更新字典,否则使用新ID将名称电子邮件添加到字典中。 该代码将如下所示:

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