【问题标题】:Compare two dataframes columns and find string similiraties [duplicate]比较两个数据框列并找到字符串相似点[重复]
【发布时间】:2021-10-29 14:17:39
【问题描述】:

我在一个使用 python 的项目中,我有两个数据框

Product Name Cost
Car with batteries 2
Headphones Sony 3
Product Name Cost
Car batteries 2
Headphones Sony 3

我要做的是比较这些数据框并放置一个显示“匹配”的列 但是就像您看到的那样,必须将汽车与电池和汽车电池进行比较并放置火柴,因为它们是相同的产品。 有可能吗?

【问题讨论】:

  • 我认为您正在寻找模糊匹配。有几种方法可以实现这一点,您需要尝试一下,看看哪种方法最有效。首先是fuzzy-pandas pypi.org/project/fuzzy-pandas 库,或者您可以尝试使用fuzzywuzzy 库,参见例如geeksforgeeks.org/….

标签: python pandas dataframe


【解决方案1】:

假设第一个数据帧是df1,第二个是df2,您可以:

  • 在您选择的数据框中创建一个新列(df1df2 甚至是一个新列)
  • 请致电此新专栏"Matched"
  • 使用条件结果填充新列值:如果条件为真,使用True 填充,否则使用False 填充:
    df1["Matches"] = df1["Cost"] ==  df1["Cost"] 

这将根据 2 个数据帧中相同行的电池成本是否匹配(假设 df1df2 具有相同的行数)创建一个新的 True/False 值列。

【讨论】:

    【解决方案2】:

    您可以使用fuzzywuzzy 来查找值的相似性。例如,使用fuzz.ratio(str1, str2) 将返回一个指示字符串有多相似的指示符。还有其他方法。您必须自己找出最适合您的用例的方法。


    下面的例子使用fuzz.ratio(str1, str2),并认为80的比率是相等的:

    # pip install fuzzywuzzy python-levenshtein
    # or: conda install -c conda-forge fuzzywuzzy python-levenshtein
    
    import io
    import pandas as pd
    
    from fuzzywuzzy import fuzz
    
    df1 = pd.read_csv(io.StringIO("""
    Product Name, Cost
    Car with batteries, 2
    Headphones Sony, 3
    """))
    
    df2 = pd.read_csv(io.StringIO("""
    Product Name, Cost
    Car batteries, 2
    Headphones Sony, 3
    """))
    
    COLUMN_NAME = "Product Name"
    ACCEPTED_RATIO = 80
    
    def match(right, left):
        return fuzz.ratio(right, left) > ACCEPTED_RATIO
    
    rsuffix = "_r"
    compared = df1.join(df2, rsuffix=rsuffix)
    compared["Matches"] = compared.apply(
        lambda x: match(x[COLUMN_NAME], x[f"{COLUMN_NAME}{rsuffix}"]),
        axis=1,
    )
    compared = compared.drop(
        [c for c in compared.columns if c.endswith(rsuffix)],
        axis=1
    )
    

    print(compared) 的输出将是:

              Product Name  Cost    Matches
    0   Car with batteries     2       True
    1      Headphones Sony     3       True
    

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多