【问题标题】:Python Pandas - Fuzzy duplicates matchingPython Pandas - 模糊重复匹配
【发布时间】:2018-12-17 08:56:08
【问题描述】:

我有一个这样的数据框:

    make                model
0   allard              K1
1   alllard             J2
2   alpine renault      A110
3   alpine renualt      A310
4   amc (rambler        American
5   amc (rambler)       Marlin
6   aries               1907
7   ariès               1932
8   austin healey       3000
9   austin-healey       Sprite
10  benjamin et benova  Type B3
11  benjamin/benova     Type P2
12  benjmin/benova      Type P3

我们的目标是让第三列具有最高模糊率(最接近的模糊匹配)的行的索引。

如何以有效的方式比较行?

【问题讨论】:

  • 您指的是make 列还是两列的某种组合?
  • 你的预期输出是什么?

标签: python pandas indexing fuzzy-comparison fuzzywuzzy


【解决方案1】:

使用fuzzywuzzy,并假设make列的模糊性应该匹配,您可以尝试:

import pandas as pd
from itertools import product
from fuzzywuzzy.fuzz import ratio

df = pd.read_csv('data.csv')
keys = list(set(df['make']))
ratios = pd.DataFrame([{'k1': k1, 'k2': k2, 'ratio': ratio(k1, k2)} for k1, k2 in product(keys, keys) if k1 != k2])

def find_closest(make):
    return df[df['make'] == ratios.loc[ratios[ratios['k1'] == make]['ratio'].argmax(), 'k2']].index.values[0]

df['closest_index'] = df['make'].apply(find_closest)

print(df)

数据的输出:

                  make     model  closest_index
0               allard        K1              1
1              alllard        J2              0
2       alpine renault      A110              3
3       alpine renualt      A310              2
4         amc (rambler  American              5
5        amc (rambler)    Marlin              4
6                aries      1907              7
7                ariès      1932              6
8        austin healey      3000              9
9        austin-healey    Sprite              8
10  benjamin et benova   Type B3             11
11     benjamin/benova   Type P2             12
12      benjmin/benova   Type P3             11

【讨论】:

  • 好的。超级酷,这就是我想要的。但是有两件事:首先,在find_closest 定义中,res 应该替换为ratios。其次,如果我有 200 000 行,你认为我可以使用这种方法吗?
  • 谢谢,已修复 :)
  • 关于规模,您希望拥有多少个独特的makes?我希望最初删除重复项会显着过滤结果,然后运行 ​​ratio 计算不应该太重
  • 我也在考虑对models 使用相同的方法。删除重复项后,我最终将拥有大约 40 000 行。正如您可能理解的那样,我关心的是itertools.product..
  • 是的,我明白为什么会有问题。我会尝试几件事:1)将ratio 的计算量减少一半(仅计算k1, k2 并将结果插入为k2, k1)。 2) 尝试存储所有现有值(例如,按 5 的倍数的总字符串长度)并仅在存储桶内进行 product 比较。
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2023-04-03
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多