3

fuzzywuzzy を使用して、会社名の csv でほぼ一致するものを見つけています。いくつかの有用な近接一致を見つけることを期待して、手動で一致した文字列と一致しない文字列を比較していますが、fuzzywuzzy 内で文字列またはバッファ エラーが発生しています。私のコードは次のとおりです。

from fuzzywuzzy import process
from pandas import read_csv

if __name__ == '__main__':
    df = read_csv("usm_clean.csv", encoding = "ISO-8859-1")
    df_false = df[df['match_manual'].isnull()]  
    df_true = df[df['match_manual'].notnull()]
    sss_false = df_false['sss'].values.tolist()
    sss_true = df_true['sss'].values.tolist()


    for sssf in sss_false:
        mmm = process.extractOne(sssf, sss_true) # find best choice
        print sssf + str(tuple(mmm))

これにより、次のエラーが発生します。

Traceback (most recent call last):
File "fuzzywuzzy_usm2_csv_test.py", line 21, in <module>
mmm = process.extractOne(sssf, sss_true) # find best choice
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/process.py", line 123, in extractOne
best_list = extract(query, choices, processor, scorer, limit=1)
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/process.py", line 84, in extract
processed = processor(choice)
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/utils.py", line 63, in full_process
string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace(s)
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/string_processing.py", line 25, in replace_non_letters_non_numbers_with_whitespace
return cls.regex.sub(u" ", a_string)
TypeError: expected string or buffer

これは、エンコーディングを指定してパンダにインポートした場合の影響と関係があります。これを防止するために追加しましUnicodeDecodeErrorsたが、このエラーを引き起こすというノックオン効果がありました。オブジェクトの使用を強制しようとしましたが、うまくいきstr(sssf)ません。

そのため、エラーの原因となっている行を特定しました#N/A,,,,,,(下に貼り付けたコードの 29 行目)。エラーの原因は だと思いましたが#、不思議なAことに、ファイルが削除されたときにファイルが機能するため、問題の原因は char ではありません。私にとって奇妙なのは、2行下の文字列N/Aがうまく解析されることですが、#シンボルを削除すると、フィールドが下のフィールドと同じように見えても、29行目は解析されません。

sss,sid,match_manual,notes,match_date,source,match_by
N20 KIDS,1095543_cha,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N21 FESTIVAL,08190588_com,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N21 LTD,,,,,,
N21 LTD.,04615294_com,true,,2014-12-02,,OpenCorps
N2 CHECK,08105000_com,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N2 CHECK LIMITED,06139690_com,true,,2014-12-02,,OpenCorps
N2CHECK LIMITED,08184223_com,,,2014-05-05,,20140429_fuzzy_match.ktr (stream 3)
N 2 CHECK LTD,05729595_com,,,2014-05-05,,20140429_fuzzy_match.ktr (stream 2)
N2 CHECK LTD,06139690_com,true,,2014-12-02,,OpenCorps
N2CHECK LTD,05729595_com,,,2014-05-05,,20140429_fuzzy_match.ktr (stream 2)
N2E & BACK LTD,05218805_com,,,2014-05-05,,20140429_fuzzy_match.ktr (stream 2)
N2 GROUP LLC,04627044_com,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N2 GROUP LTD,04475764_com,true,,2014-05-05,data taken from u_supplier_match,20140429_fuzzy_match.ktr (stream 2)
N2R PRODUCTIONS,SC266951_com,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N2 VISUAL COMMUNICATIONS LIMITED,,,,,,
N2 VISUAL COMMUNICATIONS LTD,03144224_com,true,,2014-12-02,data taken from u_supplier_match,OpenCorps
N2WEB,07636689_com,,,2014-10-12,,20140429_fuzzy_match.ktr (stream 3)
N3 DISPLAY GRAPHICS LTD,04008480_com,true,,2014-12-02,data taken from u_supplier_match,OpenCorps
N3O LIMITED,06561158_com,true,,2014-12-02,,OpenCorps
N3O LTD,,,,,,
N400138,,,,,,
N400360,,,,,,
N4K LTD,07054740_com,,,2014-05-05,,20140429_fuzzy_match.ktr (stream 2)
N51 LTD,,,,,,
N68 LTD,,,,,,
N8 LTD,,,,,,
N9 DESIGN,07342091_com,true,,2015-02-07,openrefine/opencorporates,IM
#N/A,,,,,,
N A,,,,,,
N/A,red_general_xtr,true,Matches done manually,2015-04-16,manual matching,IM
(N) A & A BUILDERS LTD,,,,,,
4

2 に答える 2

2

デフォルトでは、文字列を非数値 ( )としてpandas.read_csv解析します。'N/A'NaN

あなたの場合、それはnan文字列ではなく値になることを意味します。サンプル データ セットでは、これは 2 つの場所で発生します。

下から 3 行目 (質問で強調表示した行) の結果は次のようになります。sss_false[-3] == nan

最後の行の結果はsss_true[-1] == nan.


オプション1

'N/A'文字列を ではなく文字列として解析したい場合nan、これを行う方法は

df = read_csv("usm_clean.csv", encoding = "ISO-8859-1")

df = read_csv("usm_clean.csv", encoding = "ISO-8859-1", keep_default_na=False, na_values='')

これらの追加オプションの意味は、pandas docsで説明されています。

na_values : list-like または dict、デフォルト None

NA/NaN として認識する追加の文字列。dict が渡された場合、特定の列ごとの NA 値

keep_default_na : bool、デフォルトは True

na_values が指定され、keep_default_na が False の場合、デフォルトの NaN 値は上書きされます。それ以外の場合は、に追加されます

したがって、上記の変更は、空の文字列を NA として認識し、デフォルト値を破棄するように pandas に指示します'N/A'


オプション 2

最初の列の で行を破棄する場合は、 とからメンバー'N/A'を削除する必要があります。これを行う1つの方法は次のとおりです。nansss_truesss_false

sss_true = [x for x in sss_true if type(x) != str]
sss_false = [x for x in sss_false if type(x) != str]
于 2015-06-15T10:40:00.273 に答える
0

変数sss_trueには次が含まれます。

[
    u'N21 LTD.',
    u'N2 CHECK LIMITED',
    u'N2 CHECK LTD',
    u'N2 GROUP LTD',
    u'N2 VISUAL COMMUNICATIONS LTD',
    u'N3 DISPLAY GRAPHICS LTD',
    u'N3O LIMITED',
    u'N9 DESIGN',
    nan              # <---- note this
]

その数値ではない値を取り除くと、すべてが期待どおりに機能し始めます。

于 2015-06-15T06:29:45.267 に答える