Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中:如何找到同一行中字符串的匹配,将(模糊的)匹配字符串的一部分与列表进行比较?_Python_Regex_String_Pandas_Fuzzy Comparison - Fatal编程技术网

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

在python中:如何找到同一行中字符串的匹配,将(模糊的)匹配字符串的一部分与列表进行比较?,python,regex,string,pandas,fuzzy-comparison,Python,Regex,String,Pandas,Fuzzy Comparison,我有一个匹配的问题,我已经试图解决,但没有找到一种方法来这样做。我是python新手,所以可能有一些简单的方法来实现这一点。我搜索了这些问题,但没有找到任何符合我需要的东西 目的 我需要确定一个“类型”的人(定义见下文),如果他们属于一组列表中的一组,请记下该组。结果应该是数据框中的一行,其中包含对人员姓名、类型和所属关系的观察。所有数据都以字符串的形式存在,我必须解析出字符串的多个部分 数据 我的数据当前如下所示: lastname person1 p

我有一个匹配的问题,我已经试图解决,但没有找到一种方法来这样做。我是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
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'
我知道读起来很糟糕,但我才刚刚开始。(欢迎大家发表意见。)

这些问题是:

  • lastname很短,因此与人员列表的匹配可以是简单的
    在'b'
    中的'a',但我希望person1…N字符串中的公司名称会有拼写错误或特殊性(将“C-SPAN”和“CSPAN”视为一个名称的可能版本)
  • 人员的列数是静态的。也就是说,它是固定的(尽管许多条目将是空的,因此当列数固定为100时,一些行将只有1或2个条目)
  • person1…N字符串的格式不一致。也就是说,可能有多个逗号、句点、连字符等。因此,在逗号a上拆分后得到所有内容并不总是给出公司名称 更新

    由于有很多问题,我意识到我对数据的格式还不够详细。
    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')