[英]Iterate through dataframe rows to match word in list
我的目標是測量 dataframe 的行和單詞列表之間的相似性。 我的代碼如下所示:
import pandas as pd
import distance
import numpy as np
df = pd.DataFrame({'col': ['apps','orange juice','citrs']})
li = ['apple','orange','citrus']
df['SIM'] = np.nan
df['SIM_COL'] = np.nan
for row in df.iterrows():
row_data = row[1].tolist()
for l in li:
if distance.jaccard(row_data[0],l) < 0.5:
df.loc[[df[df['col']==row_data[0]].index.values[0]],'SIM']= distance.jaccard(row_data[0],l)
df.loc[[df[df['col']==row_data[0]].index.values[0]],'SIM_COL']= l
break
這是我的 output:
col SIM SIM_COL
0 apps NaN NaN
1 orange juice 0.454545 orange
2 citrs 0.166667 citrus
當我使距離條件< 0.5
時,這很好。 如果我將其更改為1
,我的 output 將變為:
col SIM SIM_COL
0 apps 0.600000 apple
1 orange juice 0.846154 apple
2 citrs 0.900000 orange
現在它給了我橙子和柑橘的錯誤結果。 我怎樣才能做到只考慮最低距離?
結果是對的。 看
print(distance.jaccard('orange juice', 'apple'))
# 0.846154
我怎樣才能做到只考慮最低距離?
我會使用一個額外的變量min_dist
來記錄最低距離。 僅當新距離小於當前最低距離時,才更新df['SIM']
和df['SIM_COL']
。
for row in df.iterrows():
row_data = row[1].tolist()
min_dist = 999 # Init with a big value
for l in li:
dist = distance.jaccard(row_data[0], l)
if dist < 1 and dist < min_dist:
min_dist = dist
df.loc[[df[df['col']==row_data[0]].index.values[0]],'SIM'] = dist
df.loc[[df[df['col']==row_data[0]].index.values[0]],'SIM_COL']= l
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.