簡體   English   中英

模糊字符串匹配 Python - dataframe

[英]Fuzzy String Matching Python - dataframe

我已經提到了這篇文章,但無法讓它針對我的特定案例運行。 我有兩個數據框:

import pandas as pd

df1 = pd.DataFrame(
    {
        "ein": {0: 1001, 1: 1500, 2: 3000},
        "ein_name": {0: "H for Humanity", 1: "Labor Union", 2: "Something something"},
        "lname": {0: "Cooper", 1: "Cruise", 2: "Pitt"},
        "fname": {0: "Bradley", 1: "Thomas", 2: "Brad"},
    }
)

df2 = pd.DataFrame(
    {
        "lname": {0: "Couper", 1: "Cruise", 2: "Pit"},
        "fname": {0: "Brad", 1: "Tom", 2: "Brad"},
        "score": {0: 3, 1: 3.5, 2: 4},
    }
)

然后我做:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process
from itertools import product

N = 60
names = {
    tup: fuzz.ratio(*tup)
    for tup in product(df1["lname"].tolist(), df2["lname"].tolist())
}

s1 = pd.Series(names)
s1 = s1[s1 > N]
s1 = s1[s1.groupby(level=0).idxmax()]

degrees = {
    tup: fuzz.ratio(*tup)
    for tup in product(df1["fname"].tolist(), df2["fname"].tolist())
}

s2 = pd.Series(degrees)
s2 = s2[s2 > N]
s2 = s2[s2.groupby(level=0).idxmax()]

df2["lname"] = df2["lname"].map(s1).fillna(df2["lname"])
df2["fname"] = df2["fname"].map(s2).fillna(df2["fname"])
df = df1.merge(df2, on=["lname", "fname"], how="outer")

結果不是我所期望的。 你能幫我編輯這段代碼嗎? 請注意,我在 df1 中有數百萬行,在 df2 中有數百萬行,所以我也需要一些效率。

基本上,我需要將 df1 中的人與 df2 中的人匹配。 在上面的示例中,我在姓氏 (lname) 和名字 (fname) 上匹配它們。 我還有第三個,我把它留在這里是為了節省。

預期結果應如下所示:

ein ein_name    lname   fname   score
0   1001    H for Humanity  Cooper  Bradley 3
1   1500    Labor Union Cruise  Thomas  3.5
2   3000    Something something Pitt    Brad    4

你可以試試這個:

import pandas as pd
from fuzzywuzzy import fuzz

# Find matching rows
df1["match"] = (df1["lname"] + df1["fname"]).map(
    lambda x: [
        i
        for i, value in enumerate(df2["lname"] + df2["fname"])
        if fuzz.ratio(x, value) > 75
    ]
)

# Add score
df1["score"] = df1["match"].apply(lambda x: df2.loc[x[0], "score"])

# Cleanup
df1 = df1.drop(columns="match")

接着:

print(df1)

    ein             ein_name   lname    fname  score
0  1001       H for Humanity  Cooper  Bradley    3.0
1  1500          Labor Union  Cruise   Thomas    3.5
2  3000  Something something    Pitt     Brad    4.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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