如何在同一行中找到字符串的匹配,将(模糊)匹配字符串的一部分与列表进行比较



我有一个匹配问题,我试图解决,但还没有找到这样做的方法。我是python的新手,所以可能会有简单的方法来做这件事。我已经搜索了这些问题,但还没有找到任何我所需要的。

我需要识别人的"类型"(将在下面定义),如果他们属于组列表中的一个,请注意该组。结果应该是数据框中的单行,其中包含对该人的姓名、类型和所属关系的观察。这些数据都以字符串的形式存在,我必须解析字符串的多个部分。

我的数据现在是这样的:

lastname       person1                person2                person3
smith          matt smith, company a  tom jones, company b   karen cook, company c
jones          matt smith, company a  tom jones, company b   karen cook, company c
cook           matt smith, company a  tom jones, company b   karen cook, company c

还有,我有一份公司名单

CompanyName
company a
company b
company d

步骤大致是(用伪代码)针对数据框

中的每一行
If lastname is in person1:
   if person1 company is in list of CompanyNames:
       df['persontype'] = 1 #where 1 indicates being in a listed company
       df['affiliation'] = company name #the matched item from CompanyName list
   else if lastname is in person2: 
       if person2 company is in list of CompanyNames: 
            df['personatype'] = 1
            df['affiliation'] = company name
       else if lastname is in person3: 
            if person3 company name is in list of CompanyNames: 
                df['persontype'] = 1
                df['affiliation'] = company name
            else: 
                df['persontype'] = 0 #indicating a person in an unlisted company
                df['affiliation'] = 'Unlisted'

我知道读起来很糟糕,但我才刚刚开始。(欢迎所有评论)

问题是:

  1. 姓氏很短,因此与人员列表的匹配可以是简单的is 'a' in 'b',但我希望person1中的公司名称…N字符串有拼写错误或特殊(认为"C-SPAN"one_answers"CSPAN"是一个名字的可能版本)。
  2. 人员的列数是静态的。也就是说,它是固定的(尽管许多条目将为空,因此虽然列数固定为100,但有些行将只有1或2个条目)。
  3. person1…N个字符串不一致。也就是说,可以有多个逗号、句号、连字符等。因此,用逗号分隔并在其后面获得所有内容并不总是会给出公司名称。

多亏了这些很棒的问题,我意识到我在数据格式上做得不够详细。person1..N列下的项是高度可变的。下面这些列的实际数据示例:

person1
Hill, Daniel O., Assistant Administrator for Technology, U.S. Small Business Administration
person2
R&D Credit Coalition, R. Randall Capps

这就是为什么我没有尝试使用.split()方法马上。令牌的顺序并不统一,有些有职位/工作以及组织的名称,并且名称并不总是按"电话簿"顺序排列。

预期的结果

我想以这个(除了所有其他列)的数据框结束

lastname  ...   persontype     affiliation 
smith           1              company a
jones           1              company b
cook            0              None

感谢TON在这方面的任何指示,指导等。我一直在使用fuzzywuzzy模块,但没有任何成功。

注意:我没有在这里提供示例代码,因为失败不是单行或函数。我提供的任何东西都有太多的辅助问题,不值得你花时间去看。

数据格式

提供的数据格式不清楚关联或分隔符,因此我将重申我认为您的意思。(在python语法结构中)

数据:

lastname       person1                person2                person3
smith          matt smith, company a  tom jones, company b   karen cook, company c
jones          matt smith, company a  tom jones, company b   karen cook, company c
cook           matt smith, company a  tom jones, company b   karen cook, company c

还有,我有一份公司名单

CompanyName
company a
company b
company d

我认为它的意思是:

lastname = ['smith','jones','cook']
companies = ['company a','company b']
affiliations = {'matt smith':'company a','tom jones':'company b','karen cook':'company c'}

我认为应该如何格式化

lastname = ['smith','jones','cook']
companies = ['company a','company b']
names = {'smith':'matt smith','jones':'tom jones','cook':'karen cook'}
affiliations = {'matt smith':'company a','tom jones':'company b','karen cook':'company c'}

预期的结果

思路是提供以下输出:

lastname  ...   persontype     affiliation 
smith           1              company a
jones           1              company b
cook            0              None

如何得到想要的结果

注意:这是我认为最好的格式。

print('lastnametpersontypetaffiliationn')
for last in lastname:
    if last in names:
        full = names[last]
        if full in affiliations:
            comp = affiliations[full]
            if comp in companies:
                print(full+'t1t'+comp)
            else:
                print(full+'t0tNone')
        else:
            print(full+' is not listed in affiliations.')
    else:
        print(last+' has no matches in names.')
    print('n')

我不知道你是否能够创建我认为你应该使用的数据格式。如果您的数据是具有您提供的形状的纯文本格式,那么读取文件并处理这些行应该是相当简单的。

如果你想把它打印回一个文件,这也是可行的,研究一下内置函数open()和write()。

我希望这是有帮助的。享受吧!

最新更新