正如标题所说,我试图在某些条件下在数据帧的每对列上应用函数。我将尝试说明这一点。我的df格式如下:
Code | 14 | 17 | 19 | ...
w1 | 0 | 5 | 3 | ...
w2 | 2 | 5 | 4 | ...
w3 | 0 | 0 | 5 | ...
代码对应于矩形网格中的确定位置,并且ws是不同的单词。我想在每对列之间应用余弦相似性度量(EDITED!) 如果该对中一列中的项目总和大于5 。
所需的输出类似于:
| [14,17] | [14,19] | [14,...] | [17,19] | ...
Sim |cs(14,17) |cs(14,19) |cs(14,...) |cs(17,19)..| ...
cs是每对列的余弦相似性的结果。 有没有合适的方法来做到这一点?
任何帮助将不胜感激: - )
答案 0 :(得分:3)
要将余弦指标应用于两个输入集合中的每对,您
可以使用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