正如标题所说,我试图在某些条件下对数据框的每对列应用一个函数。我将尝试说明这一点。我的 df 是以下形式:
Code | 14 | 17 | 19 | ...
w1 | 0 | 5 | 3 | ...
w2 | 2 | 5 | 4 | ...
w3 | 0 | 0 | 5 | ...
Code对应一个矩形网格中的一个确定位置,ws是不同的词。我只想在每对列之间应用余弦相似性度量 (已编辑!) 如果该对列中的一列中的项目总和大于 5 。
所需的输出类似于:
| [14,17] | [14,19] | [14,...] | [17,19] | ...
Sim |cs(14,17) |cs(14,19) |cs(14,...) |cs(17,19)..| ...
cs 是每对列的余弦相似度的结果。
有没有合适的方法来做到这一点?
任何帮助,将不胜感激 :-)
最佳答案
要将余弦度量应用于来自两个输入集合的每一对,您
可以使用 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
关于python - Pandas:在约束下的每对列上应用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38455278/