我有一个df
id val1 val2 val3
100 aa bb cc
200 bb cc 0
300 aa cc 0
400 bb aa cc
从这里我必须生成一个 df,像这样:
100 200 300 400
100 3 2 2 3
200 2 2 1 2
300 2 1 2 2
400 3 2 2 3
说明:id 100包含aa,bb,cc
,200包含bb,cc,0
有2个相似的值。
因此在我的最终矩阵中,应该插入 index-100 和 column 200 的交集单元格,2。
同样对于 id 200- 值是 bb,cc,0
而对于 id 300 - aa,cc,0
这里的相似度是1,因此在我的最终矩阵中 200(index)-300(column)对应的单元格应插入1.
最佳答案
一些预处理。首先,set_index
到 id
并去掉 0
,我们不需要它们。
df = df.set_index('id').replace('0', np.nan)
df
val1 val2 val3
id
100 aa bb cc
200 bb cc NaN
300 aa cc NaN
400 bb aa cc
现在,结合使用 pd.get_dummies
和 df.dot
并获得相似度分数。
x = pd.get_dummies(df)
y = x.groupby(x.columns.str.split('_').str[1], axis=1).sum()
y.dot(y.T)
100 200 300 400
id
100 3 2 2 3
200 2 2 1 2
300 2 1 2 2
400 3 2 2 3
关于python - 从 Pandas 数据帧生成相似度矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441705/