我有以下两个数据集:
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)
接下来我想在all 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 :(得分:0)
你在做:
question = all['category'][0]
选择“类别”列中的第一行,而不是您选择的索引(lookup_value)。
你应该改为:
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的索引。