【问题标题】:Pandas: Apply function over each pair of columns under constraintsPandas:在约束下对每对列应用函数
【发布时间】:2016-11-22 03:45:26
【问题描述】:

正如标题所说,我试图在某些条件下对数据框的每一对列应用一个函数。我将尝试说明这一点。我的 df 格式为:

Code |  14  |  17  |  19  | ...
w1   |  0   |   5  |   3  | ...
w2   |  2   |   5  |   4  | ... 
w3   |  0   |   0  |   5  | ...

代码对应于矩形网格中的确定位置,ws是不同的词。我只想在每对列之间应用余弦相似度度量(已编辑!) 如果一对列中的项目总和大于 5

所需的输出类似于:

     | [14,17]  |  [14,19]  |  [14,...]  |  [17,19]  | ...
Sim  |cs(14,17) |cs(14,19)  |cs(14,...)  |cs(17,19)..| ...

cs 是每对列的余弦相似度的结果。 有没有合适的方法来做到这一点?

任何帮助将不胜感激:-)

【问题讨论】:

  • 如果我直截了当,你不会想要cs(14,17)cs(14,19) 等,因为“14”列中没有大于 5 的项目。你尝试过什么吗?能否请您提供一些失败的代码和示例?
  • 嗨,@danielhadar。实际上到目前为止,我已经手动完成了一些计算。我在问是否有任何方法可以将函数(在这种情况下为余弦相似度,但我将应用更多函数)以矢量方式应用于每对列,即无需在列上编写循环。最后一个df的build只是为了对结果有更好的可视化,但这并不重要。

标签: python pandas cosine-similarity


【解决方案1】:

要将余弦度量应用于来自两个输入集合的每一对,您 可以使用scipy.spatial.distance.cdist。这将比 使用双 Python 循环。

设一个集合是df 的所有列。让其他集合仅是总和大于 5 的那些列:

import pandas as pd
df = pd.DataFrame({'14':[0,2,0], '17':[5,5,0], '19':[3,4,5]})
mask = df.sum(axis=0) > 5
df2 = df.loc[:, mask]

然后可以通过调用cdist 来计算所有余弦相似度:

import scipy.spatial.distance as SSD
values = SSD.cdist(df2.T, df.T, metric='cosine')
# array([[  2.92893219e-01,   1.11022302e-16,   3.00000000e-01],
#        [  4.34314575e-01,   3.00000000e-01,   1.11022302e-16]])

这些值可以包装在一个新的 DataFrame 中并重新整形:

result = pd.DataFrame(values, columns=df.columns, index=df2.columns)
result = result.stack()

import pandas as pd
import scipy.spatial.distance as SSD
df = pd.DataFrame({'14':[0,2,0], '17':[5,5,0], '19':[3,4,5]})
mask = df.sum(axis=0) > 5
df2 = df.loc[:, mask]
values = SSD.cdist(df2.T, df.T, metric='cosine')
result = pd.DataFrame(values, columns=df.columns, index=df2.columns)
result = result.stack()
mask = result.index.get_level_values(0) != result.index.get_level_values(1)
result = result.loc[mask]
print(result)

产生系列

17  14    0.292893
    19    0.300000
19  14    0.434315
    17    0.300000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多