2014-09-18 3 views
1

У меня есть dataframe так:Панды: вычисление матрицы на значения

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

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

 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, чтобы вычислить только расстояние для пар, а затем использовать pandas для заполнения остальных.

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 
Смежные вопросы