查找2df python之间的值相似度

时间:2018-09-03 11:13:37

标签: python pandas similarity

在python中,我的工作有问题。我试图将我的数据框更改为列表并找到结果,但是它不起作用。我的输入有2个pandas.dataframe。我想通过使用Df2的val1,val2和val3找到df1和df2之间的item1的相似性,以通过使用Df1的val1,val2和val3与item1进行比较。我将使用Pearson相关找到相似性。

输入:

Df1                                  Df2
 item1 item2  val1 val2 val3          item1 val1 val2 val3
  1      2     0.1  0.2  0.3            1    0.1  0.5  0.7
  1      3     0.2  0.3  0.5            2    0.2  0.8  0.9
  2      4     0.5  0.6  0.7            3    0.7  0.6  0.5
  3      5     0.7  0.2  0.1

输出:

Output :
 item1 item2  similairity         
 1      2       0.235        
 1      3       0.567    
 2      4       0.414         
 3      5       0.231

我如何从这些数据框中找到相似性?

1 个答案:

答案 0 :(得分:1)

我不确定这个解决方案,因为我有另一个输出。但这也许有帮助。

步骤1。创建数据并合并。

import pandas as pd
from scipy.stats.stats import pearsonr

df1 = pd.DataFrame(data=[[1,2,0.1,0.2,0.3],
                         [1,3,0.2,0.3,0.5],
                         [2,4,0.5,0.5,0.7],
                         [3,5,0.7,0.2,0.1]],
                   columns=['item1', 'item2', 'val1', 'val2', 'val3'])

df2 = pd.DataFrame(data=[[1,0.1,0.5,0.7],
                         [2,0.2,0.8,0.9],
                         [3,0.7,0.6,0.5]],
                   columns=['item1', 'val1', 'val2', 'val3'])

df = df1.merge(df2,on='item1')

输出:

   item1  item2  val1_x  val2_x  val3_x  val1_y  val2_y  val3_y
0      1      2     0.1     0.2     0.3     0.1     0.5     0.7
1      1      3     0.2     0.3     0.5     0.1     0.5     0.7
2      2      4     0.5     0.5     0.7     0.2     0.8     0.9
3      3      5     0.7     0.2     0.1     0.7     0.6     0.5

第2步。定义函数来计算相关性。

def corr(df):
    return pd.DataFrame(data=[pearsonr(
        df[['val1_x', 'val2_x', 'val3_x']].as_matrix()[0],
        df[['val1_y', 'val2_y', 'val3_y']].as_matrix()[0])[0]], 
                        columns=['similarity'])

第3步。使用按项目分组并应用corr函数。

df = df.groupby(['item1', 'item2']).apply(corr).reset_index().drop(['level_2'],1)

输出:

   item1  item2  similarity
0      1      2    0.981981
1      1      3    0.928571
2      2      4    0.609994
3      3      5    0.933257