Панды: матричный расчет по значениям

У меня есть датафрейм, как это:

        apple aple  apply
apple     0     0      0
aple      0     0      0
apply     0     0      0

Я хочу рассчитать расстояние до строки, например, apple -> aple и т. Д. Мой конечный результат здесь:

        apple aple  apply
apple     0     32     14
aple      32    0      30
apply     14    30     0

В настоящее время это код, который я использую (но он очень медленный для больших данных):

columns = df.columns
for r in columns:
  for c in columns:
     m[r][c] = Simhash(r).distance(Simhash(c)) 

Может ли кто-нибудь помочь мне эффективно рассчитать расстояние?

1 ответ

Одна мысль - поскольку выходные данные симметричны, итерируя по каждой паре, вы вычисляете каждую пару дважды. Кроме того, вы можете пропустить сравнение между элементом и самим собой. Поэтому, чтобы хотя бы сократить количество вычислений, вы могли бы сделать что-то вроде этого - использовать itertools для вычисления расстояния только для пар, а затем использовать панды для заполнения остальных.

from itertools import combinations
from collections import defaultdict

data = df.index

output = defaultdict(dict)

for a,b in combinations(data, 2):
    output[a][b] = Simhash(a).distance(Simhash(b))
for a in data:
    output[a][a] = 0

df = pd.DataFrame(output)

df = df.fillna(df.T)

Вам нужно будет протестировать на большом кадре, но я думаю, что это будет быстрее, чем то, что вы делаете, и должно дать тот же ответ.

In [84]: df
Out[84]: 
       aple  apple  apply
aple      0     32     30
apple    32      0     14
apply    30     14      0
Другие вопросы по тегам