2017-01-10 39 views
1

我有以下两个数据集:使用KNN来比较dataframes

import pandas as pd 
from scipy.spatial import distance 

all = {'test' : [0.3, 0.9], 
'call' : [0.2, 1.3], 
'category': ["A", "B"]} 

all = pd.DataFrame(all) 

df = pd.DataFrame() 
df = df.append({'test': 0.2, 'call': 0.4}, ignore_index=True) 

基于这些data.frames我想查哪个类别DF接近:A类或B

因此,我做了以下内容:

让所有data.frame数字

all_numeric = all[[ 'test', 'call']] 

计算ŧ他欧几里得距离

euclidean_distances = all_numeric.apply(lambda row: distance.euclidean(row, df), axis=1) 
distance_frame = pd.DataFrame(data={"dist": euclidean_distances, "idx": euclidean_distances.index}) 
distance_frame.sort("dist", inplace=True) 
print(distance_frame) 

而接下来我想在所有data.frame

lookup_value = distance_frame.iloc[0]['idx'] 
question = all['category'][0] 
print("This customer content is labeled as %s" % question) 

来查找值。但是,如果我尝试这与

df = pd.DataFrame() 
df = df.append({'test': 0.9, 'call': 1.3}, ignore_index=True) 

我应打印“标记为B“,所以我认为出了问题。有谁能告诉我,我错了吗?

回答

0

你正在做的:

question = all['category'][0]其中挑选出第一行中的列“类”,而不是您所选择的指数(Lookup_Array中)。

而应该有:

question = all['category'].loc[lookup_value]

总体而言,虽然这工作,我会鼓励你重写这个使用numpy的。熊猫是非常强大的,但如果你发现自己在成对记录(所有和df的笛卡尔积)上运算符,那么numpy将会产生一个更干净更快的解决方案。如果您需要示例,请告诉我,我很乐意在此提供一个。

编辑:

当然,这里有一种方法:

import numpy as np 
    from scipy.spatial import distance 

    center_features = np.array([[0.3, 0.9], [0.2, 1.3]]) 
    center_labels = ["A", "B"] 

    test_features = np.array([[0.2, 0.4], [0.9, 1.3]]) 

    for t in test_features: 
     print t, center_labels[np.argmin([distance.euclidean(t, c) for c in center_features])] 

环路[distance.euclidean(t, c) for c in center_features]计算固定例子(DF)和标记向量之间的距离。

np.argmin(x)给出了最小元素的索引。因此,np.min([3,1,0,2])给出0但是`np.argmin([3,1,0,2])给出了2,这是0的索引。

+0

感谢您的回答。是的,我会喜欢一个例子。 –

+0

希望有帮助! :) – Falcon9

+0

谢谢,这确实有帮助! –