簡體   English   中英

遍歷 dataframe 行以匹配列表中的單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM