【发布时间】:2017-01-30 12:49:28
【问题描述】:
我有两个数据框 D1 和 D2。我想要实现的是对于D1 和D2 中的非整数和非浮点类型的任何列对,我想使用公式计算距离度量
|A intersect B|/ |A union B|
我先定义了一个函数
def jaccard_d(series1, series2):
if (series1.dtype is not (pd.np.dtype(int) or pd.np.dtype(float))) and (series2.dtype is not (pd.np.dtype(int) or pd.np.dtype(float))):
series1 = series1.drop_duplicates()
series2 = series2.drop_duplicates()
return len(set(series1).intersection(set(series2))) /len(set(series1).union(set(series2)))
else:
return np.nan
然后我所做的是首先循环遍历D1 中的所有列,然后对于D1 中的每个固定列,我在jaccard_d 函数上使用apply。我尽量避免编写 2 层循环。可能有更好的方法而不写任何循环?
DC = dict.fromkeys(list(D1.columns))
INN = list(D2.columns)
for col in D1:
DC[col] = dict(zip(INN, D2.apply(jaccard_d,D1[col])))
首先,我不确定我是否正确使用了 apply 函数,即我的 jaccard_d 函数需要 2 个系列作为输入,但是对于每次迭代,我将 D1[col] 作为一个系列,我想要使用apply 将D1[col] 应用于D2 的所有列
其次,我收到此错误“'Series' 对象是可变的,因此它们不能被散列”,我不太明白。任何 cmets 都表示赞赏。
我尝试只编写一个 2 层循环并使用我的函数 jaccard_d 来做到这一点。有用。但我想写更高效的代码。
【问题讨论】:
-
您正在尝试使用 pandas
series作为字典键。 -
@hpaulj 你能详细说明一下吗?以及如何解决这个问题?为什么如果我只写一个 2 层循环这不会有问题?
-
这可能是一个小问题,但如果您已经将系列放入
set,是否需要drop_dupicates?set无论如何都会收集唯一值。 -
问题在于如何将数据系列传递给
apply。