使用Python和Pandas将对象列表与使用对象的另一个列表进行比较

时间:2017-04-17 20:35:03

标签: python arrays pandas

我可能会以错误的方式解决这个问题。我已经将两个带有公司名称的csv文件加载到列表中,我正在尝试比较这两个列表,以找到名称相似的位置。

这些名称已被删除,并删除了标点符号,但有时输入信息的人会缩写公司身份或拼错一个单词,所以我试图找到一种方法来根据名称的相似性来分配分数。

原始数据可能看起来像这样(不是实际数据):

Walgreens Boots Alliance
CARDINAL HEALTH
EXPRESS SCRIPTS HOLDING
j.p. morgan chase
Bank of America Corp
wells fargo
Home Depot
STATE FARM INSURANCE COS.
Johnson & Johnson
archer daniels midland

然后降低外壳,删除停用词/标点符号,并拆分:

[walgreens, boots, alliance]
[cardinal, health]
[express, scripts, holding]
[jp, morgan, chase]
[bank, america, corp]
[wells, fargo]
[home, depot]
[state, farm, insurance, cos]
[johnson, johnson]
[archer, daniels, midland]

......类似的第二个列表看起来像这样:

[cardinal, health]
[expres, scripts, holding]
[bank, america, corporation]
[wells, fargo]
[home, depot]
[state, farm, insurance, companies]
[archer, daniels]
[ford, motor, company]
[general, motors]
[john, deere]

我为Pandas编写了一个复杂的循环来测试列表中的每个单词是否也存在于其他列表中:

for index, row in df1[['Company Name Tokens']].iterrows():
    for content in row:
        for x in content:
            df1.iloc[index]['Test'] = 0
            df1.iloc[index]['Count'] = len(content)
            for idx, rw in entities[['Company Name Tokens']]:
                for r in rw:
                    if x in r:
                        df1.iloc[index]['Test'] = df1.iloc[index]['Test'] + 1

我意识到这可能真的很慢,但我并不追求效率。无论如何,我认为这种方法可能对Python解释器来说太过分了,因为我收到了一个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-192-adea96d8cb82> in <module>()
      4             df1.iloc[index]['Test'] = 0
      5             df1.iloc[index]['Count'] = len(content)
----> 6             for idx, rw in entities[['Company Name Tokens']]:
      7                 for r in rw:
      8                     if x in r:

ValueError: too many values to unpack (expected 2)

我是不是觉得这太难了,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

如果您刚开始使用这两个列表,则可以获得每个列表的集合:

shared = set(list_a).union(set(list_b))

您只需要将两个列表作为数据框架的1-D而不是2-D。当然,这仅在以标准方式输入数据时才有效。如你所提到的那样,你必须清理这两个因为输入错误。