'Cosine similarity between each row in a Dataframe in Python

I have a DataFrame containing multiple vectors each having 3 entries. Each row is a vector in my representation. I needed to calculate the cosine similarity between each of these vectors. Converting this to a matrix representation is better or is there a cleaner approach in DataFrame itself?

Here is the code that I have tried.

import pandas as pd
from scipy import spatial
df = pd.DataFrame([X,Y,Z]).T
similarities = df.values.tolist()

for x in similarities:
    for y in similarities:
        result = 1 - spatial.distance.cosine(x, y)


Solution 1:[1]

You can import pairwise_distances from sklearn.metrics.pairwise and pass the data-frame for which you want to calculate cosine similarity, and also pass the hyper-parameter metric='cosine', because by default the metric hyper-parameter is set to 'euclidean'.

DEMO

import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import pairwise_distances

df = pd.DataFrame(np.random.randint(0, 5, (3, 5)))

df
##      0   1   2   3   4
## 0    4   2   1   3   2
## 1    3   2   0   0   1
## 2    3   3   4   2   4

pairwise_distances(df,metric='cosine')
##array([[2.22044605e-16, 1.74971353e-01, 1.59831950e-01],
   [1.74971353e-01, 0.00000000e+00, 3.08976681e-01],
   [1.59831950e-01, 3.08976681e-01, 0.00000000e+00]])

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1