2017-04-17 3 views
0

これは間違った方法です。私は会社の名前の2つのcsv文書をリストに入れました。そして、2つのリストを比較して名前が似ている場所を見つけようとしています。PythonとPandasを使用してオブジェクトリストを別のリストと比較する

名前は小文字で、句読点は削除されていますが、情報を入力する人が会社のIDを省略したり、単語のスペルを間違えたりすることがあるため、名前の類似度に基づいてスコアを割り当てる方法を見つけようとしています。その後

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] 

...と同様の第2

オリジナルデータは、この(ない実際のデータ)のようになります。私はパンダのための複雑なループを書いた

[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] 

:リストは次のようになりますリスト内の各単語が他のリストにも含まれているかどうかをテストします。

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) 

私は、これはあまりにも困難にし、これを行うには良い方法はありますかな?

+0

この「ナイーブな」方法は、常に遅くなります。あなたは逆インデックスのようなより良いデータ構造を使いたいと思っています - 最終的な仕事に応じて、単語が見つかった行番号のリストを含む単語の辞書を作成してください。 – liborm

+0

@liborm interesting ... {'archer':[1,2,3,4]、 'daniels':[1,2,3,4]、 'midland':[]}のようなもの? – Twitch

+0

データ構造やアルゴリズムの提案を得るには、あなたのタスクをもっと指定する必要があります。しかし、一般的にyes - データセットの1つをインデックスに処理し、他の検索語を1つずつスキャンしますインデックス。 – liborm

答えて

0

あなたはちょうどあなたがリストごとに和集合を得ることができるで始めるために2つのリストを持っている場合:

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

あなただけの1-Dの代わりに、2-Dのように二つのリストが必要になりますDataFramesはあります。これは、データが標準的な方法で入力された場合にのみ有効です。あなたが言及したように入力の間違いのためにあなたは2つをきれいにする必要があります。

関連する問題