to_dict的奇怪行为

时间:2015-10-26 05:12:10

标签: python numpy pandas fuzzywuzzy

我正在使用FuzzyWuzzy构建模糊搜索程序,以在数据集中查找匹配的名称。正如预期的那样,我的数据位于大约10378行的DataFrame中,len(df['Full name'])是10378。但是len(choices)只有1695。

我在IPython Notebook中运行Python 2.7.10和pandas 0.17.0

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,我假设它与主数据帧中的索引相同。 / p>

我非常确定问题出在第一行,to_dict()函数,len(df['Full name'].astype(str)导致10378,len(df['Full name'].to_dict())导致1695。

1 个答案:

答案 0 :(得分:2)

问题是你的数据框中有多行,其中索引是相同的,因为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())的值来确认这一点。 1}}。

如果您满足于将数字设置为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更快。