匹配基于名称和DOB的列表

时间:2016-07-26 19:03:41

标签: python

这似乎应该很容易,但我似乎无法找到我正在寻找的东西......我有两个人名单,FirstName,LastName,出生日期,我只是想知道哪些人在两个名单中,哪些人在一个而不是另一个。

我尝试过像

这样的事情
common = pd.merge(list1, list2, how='left', left_on=['Last', 'First', 'DOB'], right_on=['Patient Last Name', 'Patient First Name', 'Date of Birth']).dropna()

基于我在网上找到的其他内容,但它给了我这个错误:

KeyError: 'Date of Birth'

我已经确认这确实是第二个列表中的列标题,所以我没有弄错。有人像这样匹配吗?什么是最简单/最快的方式?列表之间的名称可能有不同的格式,例如" Smith-Jones" vs." SmithJones"与#Smith;史密斯琼斯",但我通过从名字中删除所有的spance和标点来解决这个问题...我认为这是第一个好的一步?

1 个答案:

答案 0 :(得分:0)

试试这个,它应该可行

import sys
from StringIO import StringIO


import pandas as pd

TESTDATA=StringIO("""DOB;First;Last
    2016-07-26;John;smith
    2016-07-27;Mathew;George
    2016-07-28;Aryan;Singh
    2016-07-29;Ella;Gayau
    """)

list1 = pd.read_csv(TESTDATA, sep=";")

TESTDATA=StringIO("""Date of Birth;Patient First Name;Patient Last Name
    2016-07-26;John;smith
    2016-07-27;Mathew;XXX
    2016-07-28;Aryan;Singh
    2016-07-20;Ella;Gayau
    """)


list2 = pd.read_csv(TESTDATA, sep=";")

print list2
print list1

common = pd.merge(list1, list2, how='left', left_on=['Last', 'First', 'DOB'], right_on=['Patient Last Name', 'Patient First Name', 'Date of Birth']).dropna()
print common