在另一列

时间:2017-03-20 23:02:22

标签: python permutation data-cleaning data-cleansing fuzzy-comparison

我想查找与给定单词匹配的排列,并根据列位置排列我的数据。

IE - 我创建了一个CSV,其中包含我从几个网站上删除的数据。它看起来像这样:

Name1     OtherVars    Name2      More Vars

Stanford   23451      Mamford        No
MIT          yes      stanfor1d       12
BeachBoys    pie      Beatles      Sweeden

我想(1)从Name2中的Name1中找到每个单词的排列,然后(2)用Name1中的那个单词打印一个表格+在OtherVars中匹配单词+在Name2中单词的排列+它在MoreVars中的匹配。 (如果找不到匹配项,只需删除该单词)。

结果将是这种情况:

Name1     OtherVars     Name2      More Vars

Stanford    23451      stanford       12

那么,我该怎么做:

  1. 在其他列中查找单词的匹配排列?

  2. 在其他列中打印2个单词及其映射的值?

  3. PS - 这是一个类似的问题;然而,它是java和它的伪代码。 How to find all permutations of a given word in a given text? Difflib似乎不适合基于此的CSV:How to find the most similar word in a list in python

    PS2 - 我被建议使用Fuzzymatch但是,我怀疑在这种情况下这是一种过度杀伤。

2 个答案:

答案 0 :(得分:0)

如果您正在寻找一个为“Stanford”和“stanf1ord”返回相同输出的函数,您可以:

  • 使用小写
  • 只保留字母
  • 对字母进行排序


import re

def signature(word):
    return sorted(re.findall('[a-z]', word.lower()))

print(signature("Stanford"))
# ['a', 'd', 'f', 'n', 'o', 'r', 's', 't']
print(signature("Stanford") == signature("stanfo1rd"))
# True

您可以从第1列创建签名集或字典,并查看第2列中是否有任何匹配。

答案 1 :(得分:0)

你似乎想要模糊匹配,而不是“排列”。有一些python模糊匹配库,但我认为人们喜欢fuzzywuzzy

或者,您可以自己动手。像

这样的东西
def ismatch(s1,s2):
   # implement logic
   # return boolean if match
   pass

def group():
   pairs = [(n1, v1, n2, v2) for n1 in names1 for n2 in names2 if ismatch(n1,n2)]
   return pairs