【问题标题】:How to groupby and sum on similarity of strings [closed]如何对字符串的相似性进行分组和求和[关闭]
【发布时间】:2019-01-18 14:08:56
【问题描述】:

我想对数据框进行分组和求和。标准的 groupby 函数将完全相同的字符串组合在一起,但我需要对类似的字符串进行此操作。例如-:

United States | 10  
Germnay | 23  
Unaited Staetes | 20   
Germany | 21  
Germanny | 32  
Uniited Staites | 30 

这应该是 -:

United States 60  
Germnay 76

名称的顺序并不重要。值的总和是。

非常感谢:)

编辑:

也许创建一个为相似国家/地区提供相同 ID 的 ID 列会更简单。那我就可以分组了。

【问题讨论】:

  • 请展示您目前的工作方式。如果这给您带来了任何问题,除了我们都知道的更好的方法之外的痛苦感觉,也请添加。
  • 这看起来很棘手,因为模糊相似性不一定是传递的。例如,“dog”与“dig”相似,“dig”与“wig”相似,但“dog”与“wig”不相似。那么你如何决定如何对这些词进行分组呢?您不希望“dog”和“wig”在同一个组中,但您希望“dig”与它们都在同一个组中。
  • 您可以使用 levenshtein 距离来进行字符串相似性,并将阈值设置为 0.80
  • levenshtein 是正确的答案,但我认为它会很慢,因为您必须将每个字符串与其他字符串进行比较
  • 我同意你的看法。我认为你提出的预处理方案是正确的。

标签: python string-matching fuzzywuzzy


【解决方案1】:

不是解决方案,而是一个 hack,如果你正在做一些快速而肮脏的事情,可能会有所帮助

  1. 小写国家名称
  2. 从国家名称中删除元音
  3. 删除连续出现的辅音

以这种方式转换数据后,您可以使用普通的 groupby 并且它应该工作得很好。

我建议这样做,因为您的数据似乎是用户输入的国家/地区名称。


另一个想法:

预处理步骤:

  1. 使用经过国家名称训练的拼写校正器从错误拼写中猜出国家名称 (https://norvig.com/spell-correct.html)
  2. 使用它转换每一行数据。

然后使用 groupby 进行分组。

【讨论】:

  • 国家只是一个例子。我使用了很多不同的字符串。
  • 如果您知道结果表中的键将是什么,这应该仍然以相同的方式工作。您可以使用这些键而不是国家/地区名称进行训练。
  • 我不知道结果中的键是什么。我所知道的是,在不同的行中总会有很多相似的字符串
  • 通过快速而肮脏的方法,阿尔巴尼亚和黎巴嫩都减少到“lbn”。亚美尼亚和罗马尼亚都减少到“rmn”。由于 OP 实际上并未对国家/地区名称进行操作,因此这可能不是一个实际问题,但它展示了像这样的“有损”方法如何容易产生与字符串不同的分组。
  • @user133442 那么您可能希望对这些字符串进行聚类并将同一聚类中的字符串的值相加stats.stackexchange.com/questions/123060/…
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多