to_dictの奇妙な振る舞い

nocoolsoft

データセット内で一致する名前を見つけるために、FuzzyWuzzyを使用してあいまい検索プログラムを構築しています。私のデータは約10378行のlen(df['Full name'])DataFrameにあり、予想どおり10378です。しかしlen(choices)、1695年です。

2.7.10IPythonNotebook0.17.0Pythonとパンダを実行しています。

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())ます。

アナンドSクマール

問題は、インデックスが同じであるデータフレームに複数の行があることです。したがって、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)))コメントから分かるように) -この方法は、高速使用するよりもなるであろうzipdict

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事