Панды: матричный расчет по значениям
У меня есть датафрейм, как это:
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