生成从熊猫数据框中

问题描述:

我有一个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_dummiesdf.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 
+0

我觉得零点应该像任何其他值来处理。注意你的输出有点不同 – AndreyF

+0

@AndreyF从这里我明白了:'对于id 200,类似地 - 值是bb,cc,0和对于id 300是aa,cc,0;这里的相似性是1',表示不应该统计 –

+0

@jezrael我试过......它给了我一个不正确的答案,其他列。 –

您可以将数据转换成集,然后相交他们:

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