Да! Мы ищем декартово произведение здесь, которое дано в этом ответе. Это может быть достигнуто без for for l oop или со списком
Давайте добавим новое повторное значение в наш фрейм данных df
, чтобы оно выглядело так:
df['key'] = np.repeat(1, df.shape[0])
df
list_of_values key
0 [a, b, c] 1
1 [d, b, c] 1
2 [a, b, c] 1
3 [a, b, c] 1
Следующее слияние с самим собой
merged = pd.merge(df, df, on='key')[['list_of_values_x', 'list_of_values_y']]
Вот как выглядит объединенный кадр:
list_of_values_x list_of_values_y
0 [a, b, c] [a, b, c]
1 [a, b, c] [d, b, c]
2 [a, b, c] [a, b, c]
3 [a, b, c] [a, b, c]
4 [d, b, c] [a, b, c]
5 [d, b, c] [d, b, c]
6 [d, b, c] [a, b, c]
7 [d, b, c] [a, b, c]
8 [a, b, c] [a, b, c]
9 [a, b, c] [d, b, c]
10 [a, b, c] [a, b, c]
11 [a, b, c] [a, b, c]
12 [a, b, c] [a, b, c]
13 [a, b, c] [d, b, c]
14 [a, b, c] [a, b, c]
15 [a, b, c] [a, b, c]
Затем мы применяем желаемую функцию к каждой строке, используя axis=1
values = merged.apply(lambda x: np.intersect1d(x[0], x[1]).shape[0] / len(x[1]), axis=1)
Изменение формы для получения значений в нужном формате
values.values.reshape(4, 4)
array([[1. , 0.66666667, 1. , 1. ],
[0.66666667, 1. , 0.66666667, 0.66666667],
[1. , 0.66666667, 1. , 1. ],
[1. , 0.66666667, 1. , 1. ]])
Надеюсь, это поможет:)