生成从熊猫数据框中
问题描述:
我有一个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
和包含bb,cc,0
还有2个相似值。
因此,在我的最终矩阵,为指数-100和塔200交点细胞,应插入。
类似地,对于ID 200-值是bb,cc,0
并且对于ID 300 - aa,cc,0
这里的相似度为,因此在我的最终矩阵 对应于200(指数)的细胞-300(列)应插入1.
答
一些预处理。首先,至id
并摆脱0
s,我们并不需要它们。
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
+1
在你的答案中,0被计数,所以200-300是2,当它应该是1时。显然OP的输出是不一致的。 –
+0
固定。现在我放下'0'值 – AndreyF
我觉得零点应该像任何其他值来处理。注意你的输出有点不同 – AndreyF
@AndreyF从这里我明白了:'对于id 200,类似地 - 值是bb,cc,0和对于id 300是aa,cc,0;这里的相似性是1',表示不应该统计 –
@jezrael我试过......它给了我一个不正确的答案,其他列。 –