Я не уверен насчет этого решения, потому что у меня есть другой вывод. Но, возможно, это поможет.
Шаг 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