在python中:如何找到同一行中字符串的匹配,将(模糊的)匹配字符串的一部分与列表进行比较?
我有一个匹配的问题,我已经试图解决,但没有找到一种方法来这样做。我是python新手,所以可能有一些简单的方法来实现这一点。我搜索了这些问题,但没有找到任何符合我需要的东西 目的 我需要确定一个“类型”的人(定义见下文),如果他们属于一组列表中的一组,请记下该组。结果应该是数据框中的一行,其中包含对人员姓名、类型和所属关系的观察。所有数据都以字符串的形式存在,我必须解析出字符串的多个部分 数据 我的数据当前如下所示:在python中:如何找到同一行中字符串的匹配,将(模糊的)匹配字符串的一部分与列表进行比较?,python,regex,string,pandas,fuzzy-comparison,Python,Regex,String,Pandas,Fuzzy Comparison,我有一个匹配的问题,我已经试图解决,但没有找到一种方法来这样做。我是python新手,所以可能有一些简单的方法来实现这一点。我搜索了这些问题,但没有找到任何符合我需要的东西 目的 我需要确定一个“类型”的人(定义见下文),如果他们属于一组列表中的一组,请记下该组。结果应该是数据框中的一行,其中包含对人员姓名、类型和所属关系的观察。所有数据都以字符串的形式存在,我必须解析出字符串的多个部分 数据 我的数据当前如下所示: lastname person1 p
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
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
CompanyName
company a
company b
company d
对于数据帧中的每一行,步骤大致是(伪cod ish)
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'
我知道读起来很糟糕,但我才刚刚开始。(欢迎大家发表意见。)
这些问题是:
在'b'
中的'a',但我希望person1…N字符串中的公司名称会有拼写错误或特殊性(将“C-SPAN”和“CSPAN”视为一个名称的可能版本)person1..N
列下的条目变化很大。以下列中的实际数据示例:
person1
Hill, Daniel O., Assistant Administrator for Technology, U.S. Small Business Administration
person2
R&D Credit Coalition, R. Randall Capps
这就是为什么我没有立即尝试使用.split()
方法。代币的顺序不统一,一些代币有职位/职务以及组织名称,并且名称不总是按“电话簿”顺序排列
期望的结果
我想以一个数据帧作为结束(除了所有其他列之外)
非常感谢你在这方面的指点和指导。我一直在使用模糊模组,但没有取得任何成功
注意:我这里不提供示例代码,因为失败不是一行或一个函数。我提供的任何东西都会有太多的辅助问题,不值得您花时间来研究 数据格式 提供的数据格式不清楚关联或分隔符,因此我将重申我认为您的意思。(在python语法结构中) 您的数据: 此外,我还有一份公司名单
CompanyName
company a
company b
company d
CompanyName
company a
company b
company d
我认为这意味着:
我认为应该如何格式化
期望的结果
其目的是提供以下输出:
lastname ... persontype affiliation
smith 1 company a
jones 1 company b
cook 0 None
如何获得期望的结果
注意:这是使用我认为最好的格式
print('lastname\tpersontype\taffiliation\n')
for last in lastname:
if last in names:
full = names[last]
if full in affiliations:
comp = affiliations[full]
if comp in companies:
print(full+'\t1\t'+comp)
else:
print(full+'\t0\tNone')
else:
print(full+' is not listed in affiliations.')
else:
print(last+' has no matches in names.')
print('\n')
我不知道您是否能够创建我认为您应该使用的数据格式。虽然如果您的数据是纯文本格式,并且具有您提供的形状,那么读取文件和处理行应该相当简单
如果要将其打印回文件,也可以研究open()和write()内置函数
我希望这是有帮助的。享受吧 每行的person1-3列是否始终相同?这是一种非常低效的数据存储方式。谢谢你的提问。不,它们并不总是一样的。有重复,但那是因为数据涵盖了团体改变成员身份的若干年。好的,那么我认为如果样本数据显示这些情况会更好。非常感谢;您对格式的澄清非常有帮助。我认为我唯一没有传达的与您所注意到的不同之处是,
person1…N
下的整个条目是一个字符串。它是一个字符串,每次的格式可能都不一样(可以是“matt smith director company a”或“matt smith director company a”或其他,但总是与“company a”一起),这就是为什么我要研究模糊匹配。因此,我不知道如何在不使用公司列表搜索字符串的情况下将其转换为dict格式。再次感谢!split()将返回字符串中的单词列表(删除标点符号)。像这样使用:strings='this,is。字符串“
然后words=strings.split()
。然后,您可以使用列表理解或其他技术提取信息以填充列表和字典。要读取文件,请查看readlines()
函数。它将为文件的每一行提供易于处理的字符串。然后,您可以使用split()
将该行拆分为列。问题是,至少对像我这样的新手来说,吐口水后的物品顺序是不统一的。例如,这里有两个实际的条目:Person1:Cove,Thomas J.,体育用品制造商协会政府关系副主席
Person2:R&D信贷联盟,R.Randall Capps
您可以看到问题:公司名称并不总是排在第二位,此人的姓氏并不总是排在第一位,等等。很抱歉,这不在原始问题中。我想答案应该是模糊匹配。再次感谢@因此,如果您只是使示例数据更真实,您的境况会更好。这是一个巨大的评论部分,因为您的示例数据比实际数据简单得多。把它放在问题本身中比放在一堆后续的c中要好得多
print('lastname\tpersontype\taffiliation\n')
for last in lastname:
if last in names:
full = names[last]
if full in affiliations:
comp = affiliations[full]
if comp in companies:
print(full+'\t1\t'+comp)
else:
print(full+'\t0\tNone')
else:
print(full+' is not listed in affiliations.')
else:
print(last+' has no matches in names.')
print('\n')