データセット内で一致する名前を見つけるために、FuzzyWuzzyを使用してあいまい検索プログラムを構築しています。私のデータは約10378行のlen(df['Full name'])
DataFrameにあり、予想どおり10378です。しかしlen(choices)
、1695年です。
2.7.10
IPythonNotebook0.17.0
でPythonとパンダを実行しています。
choices = df['Full name'].astype(str).to_dict()
def fuzzy_search_to_df (term, choices=choices):
search = process.extract(term, choices, limit=len(choices)) # does the search itself
rslts = pd.DataFrame(data=search, index=None, columns=['name', 'rel', 'df_ind']) # puts the results in DataFrame form
return rslts
results = fuzzy_search_to_df(term='Ben Franklin') # returns the search result for the given term
matches = results[results.rel > 85] # subset of results, these are the best search results
find = df.iloc[matches['df_ind']] # matches in the main df
おそらくおわかりのchoices
ように、dictの結果のインデックスをとして取得していますdf_ind
。これは、メインデータフレームのインデックスと同じであると想定していました。
結果が10378、結果が1695であるため、この問題はto_dict()
関数の最初の行にあるとlen(df['Full name'].astype(str)
確信していlen(df['Full name'].to_dict())
ます。
問題は、インデックスが同じであるデータフレームに複数の行があることです。したがって、Pythonディクショナリは単一のキーに対して単一の値しか保持できないため、Series.to_dict()
メソッドでは、インデックスがキーとして使用され、これらの行は、後で来る値によって上書きされます。
この動作を示す非常に簡単な例-
In [36]: df = pd.DataFrame([[1],[2]],index=[1,1],columns=['A'])
In [37]: df
Out[37]:
A
1 1
1 2
In [38]: df['A'].to_dict()
Out[38]: {1: 2}
これはあなたのケースで起こっていることであり、コメントからわかるように、unique
インデックスの値の量はのみ1695
であるため、の値をテストすることでこれを確認できますlen(df.index.unique())
。
key
(データフレームのインデックス)として数値を使用することに満足している場合はDataFrame.reset_index()
、を使用.to_dict()
してインデックスをリセットし、それを使用できます。例-
choices = df.reset_index()['Full name'].astype(str).to_dict()
上記の例のデモ-
In [40]: df.reset_index()['A'].to_dict()
Out[40]: {0: 1, 1: 2}
これは、溶液のOPが見出さ同じである- choices = dict(zip(df['n'],df['Full name'].astype(str)))
(コメントから分かるように) -この方法は、高速使用するよりもなるであろうzip
とdict
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加