将自定义函数应用于pandas数据框中的每个列组合

时间:2019-07-24 10:16:11

标签: python pandas dataframe lambda

我正在尝试计算熊猫数据框中各列组合之间的余弦相似度。我已经编写了一个自定义函数来计算余弦相似度,现在需要将其应用于每对组合的列。如果用户尚未与之交互,则每一列都包含0;如果用户未与之交互,则每一列均包含1。因此,每一行都包含用户的总观看行为。

当前使用for循环,但是对于较大的数据样本来说太慢了-例如,我当前的样本为3408列x 28000行。

我的猜测是要使用lambda函数,但我不确定如何正确应用它。

初始数据框:

sm_views = pd.read_sql(postgreSQL_select_Query, connection).groupby().size().unstack(fill_value=0)

cos评级功能:

def cos_rating_calculator(x, y):
    dot_product = np.dot(x, y)
    distance1 = np.sqrt(sum(x))
    distance2 = np.sqrt(sum(y))
    cos_rating = dot_product / (distance1 * distance2)
    return cos_rating

用于计算关联组合的代码:

combinations = list(itertools.combinations(sm_views.columns, 2))

results = []

    for a, b in combinations:
        association_metric = cos_rating_calculator(sm_views[a], sm_views[b])
        results.append((a, b, association_metric))
        results.append((b, a, association_metric))

to_matrix = pd.DataFrame(results, columns=['a', 'b', 'association'])
association_matrix = to_matrix.pivot(index='a', columns='b', values='association')

对于较小的数据集,这可以很好地工作,但是当前数据集太大,以至于该方法不可行。我想要的输出是一列x列矩阵,其中列之间的关联度为值。

1 个答案:

答案 0 :(得分:0)

import scipy.spatial.distance
result = pd.DataFrame(list(itertools.combinations(sm_views.columns, 2)), columns=['a','b'])
result['association'] = scipy.spatial.distance.pdist(sm_views.T, 'cosine')

在此示例中,sm_view:

   col1  col2  col3
0     0     0     0
1     3     4     2
2     1     1     5

我们得到

      a     b  association
0  col1  col2     0.002946
1  col1  col3     0.354058
2  col2  col3     0.414509