从 pandas 数据帧生成相似度矩阵
Generating a similarity matrix from pandas dataframe
我有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 和 200 列、2[= 的交集单元格应插入 41=]。
类似地,对于 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
您可以将数据转换成集合,然后将它们相交:
df = df.replace('0', np.nan)
c = df.apply(lambda x: set(x.dropna()), axis=1)
df2 = pd.DataFrame([[len(x.intersection(y)) for x in c] for y in c],columns=c.index,index=c.index)
所需的输出将是:
100 200 300 400
100 3 2 2 3
200 2 2 1 2
300 2 1 2 2
400 3 2 2 3
我有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 和 200 列、2[= 的交集单元格应插入 41=]。
类似地,对于 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
您可以将数据转换成集合,然后将它们相交:
df = df.replace('0', np.nan)
c = df.apply(lambda x: set(x.dropna()), axis=1)
df2 = pd.DataFrame([[len(x.intersection(y)) for x in c] for y in c],columns=c.index,index=c.index)
所需的输出将是:
100 200 300 400
100 3 2 2 3
200 2 2 1 2
300 2 1 2 2
400 3 2 2 3