2015-04-03 1 views
1

У меня есть таблица вроде этого:ipython Pandas: Как я могу сравнить разные строки одного столбца с метрикой расстояния Левенштейна?

id name 
1 gfh 
2 bob 
3 boby 
4 hgf 

т.д.

Мне интересны, как я могу использовать Левенштейн метрики для сравнения различных строк моего колонка «имени»?

Я уже знаю, что я могу использовать это для сравнения столбцов:

L.distance('Hello, Word!', 'Hallo, World!') 

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

ответ

2

Вот способ сделать это с пандами и NumPy:

from numpy import triu, ones 
t = """id name 
1 gfh 
2 bob 
3 boby 
4 hgf""" 

df = pd.read_csv(pd.core.common.StringIO(t), sep='\s{1,}').set_index('id') 
print df 

     name 
id  
1 gfh 
2 bob 
3 boby 
4 hgf 

Создать dataframe с Список строк для измерения расстояния:

dfs = pd.DataFrame([df.name.tolist()] * df.shape[0], index=df.index, columns=df.index) 
dfs = dfs.applymap(lambda x: list([x])) 
print dfs 

    id  1  2  3  4 
id        
1 [gfh] [bob] [boby] [hgf] 
2 [gfh] [bob] [boby] [hgf] 
3 [gfh] [bob] [boby] [hgf] 
4 [gfh] [bob] [boby] [hgf] 

Mix списки, чтобы сформировать матрицу со всеми изменениями и сделать верхний правый угол, как NaNs:

dfd = dfs + dfs.T 
dfd = dfd.mask(triu(ones(dfd.shape)).astype(bool)) 
print dfd 

id   1   2   3 4 
id            
1   NaN   NaN   NaN NaN 
2 [gfh, bob]   NaN   NaN NaN 
3 [gfh, boby] [bob, boby]   NaN NaN 
4 [gfh, hgf] [bob, hgf] [boby, hgf] NaN 

Мера L.distance:

dfd.applymap(lambda x: L.distance(x[0], x[1])) 
0

Возможно, сравнивая каждое значение друг с другом и сохраняя результаты всей комбинации.

Наивно закодированы, что-то вроде

input_data = ["gfh", "bob", "body", "hgf"] 
data_len = len(input_data) 
output_results = {} 

for i in range(data_len): 
    word_1 = input_data[i] 
    for j in range(data_len): 
     if(j == i): #skip self comparison 
      continue 
     word_2 = input_data[j] 
     #compute your distance 
     output_results[(word_1, word_2)] = L.distance(word_1, word_2) 

, а затем делать то, что вы хотите с output_results