我正在使用Pandas处理一个数据框架,该数据框架有一列公司名称。
对于每个公司名称,它都有几个版本。df是一个例子:
df = pd.DataFrame({'id':['a','b','c','d','e','f'],'company name':['name1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})我想知道是否有一种简单的方法可以找到相似的名称并为它们分配一个唯一的id?对于上面的示例,我希望获得如下内容:
dg = pd.DataFrame({'id':['a','a','a','a','e','e'],'company name':['name1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})谢谢,
发布于 2020-03-18 07:04:39
我做过的一件事就是使用regex或一个处理原始字符串的函数,去掉所有多余的字符串,比如ltd和任意的特殊字符。然后创建一个经过处理的字符串,即它们的“真名”,并基于“真名”创建id的索引。
或者,您可以使用fuzzywuzzy查找两个字符串之间的距离,构建候选匹配集,并基于匹配分数构建唯一名称的索引。
即
def clean_str(x):
x2 = x.lower()
x2 = x2.replace('.', '')
return x2发布于 2020-03-18 09:01:01
我觉得你的问题,就像任何编程问题一样,需要被分解成更小的部分。我将按照我的理解和方法一步一步地分析这一点。
步骤1.清理(统一)您的company name值。这里有一篇关于data cleansing的好文章,以及为什么它很重要。
步骤2.基于唯一的公司名称映射您的id (完成步骤1后,此步骤很容易)
import pandas as pd
df = pd.DataFrame({'id':['a','b','c','d','e','f'],'company_name':['na,me1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})步骤1.
通过结合使用extract和regex来清理它
请记住,下面的regex仅捕获您提供的小样本,您可能需要设计模式以使用完整的数据集
df['new_company_name'] = (df['company_name']
.str.lower() # lowercase to standardize
.str.replace(' |,','') # remove extra characters, this may vary for your full dataset
.str.extract(r'^(\w+\d{1})')) # pattern to extract the vital part of the name, this also will vary based on your data
print(df)
id company_name new_company_name
0 a name1 name1
1 b Name1 LTD name1
2 c name1, ltd. name1
3 d name 1 LT.D. name1
4 e name2 p.p.c name2
5 f name2 ppc. name2步骤2
出于性能考虑,建议使用数值而不是str
选项1将groupby()与ngroup()结合使用
df['new_id'] = df.groupby('new_company_name').ngroup()选项2使用zip()__、dict()__,然后使用map()
unique_names = df.new_company_name.unique()
mapper = dict(
zip(unique_names,
[name_id for name_id in range(len(unique_names))]
)
)
df['new_id'] = df['new_company_name'].map(mapper)选项1或选项2的结果相同
print(df)
id company_name new_company_name new_id
0 a name1 name1 0
1 b Name1 LTD name1 0
2 c name1, ltd. name1 0
3 d name 1 LT.D. name1 0
4 e name2 p.p.c name2 1
5 f name2 ppc. name2 1希望这能有所帮助。
https://stackoverflow.com/questions/60730827
复制相似问题