Python 将列表简化为类别

Python 将列表简化为类别,python,Python,我是一名新的Python开发人员,不知道是否有人能帮我解决这个问题。我有一个数据集,其中有一列描述公司类型。我注意到专栏里有,比如外科,外科。它列出了眼镜、眼镜和验光。因此,我不想在本专栏中列出一个庞大的列表,我只想简单地列出一个类别,如果你发现一个词包含eye、Glass或opto,那么就把它改为eyewear。我的初始代码如下所示: def map_company(row): company = row['SIC_Desc'] if company in 'Surgical'

我是一名新的Python开发人员,不知道是否有人能帮我解决这个问题。我有一个数据集,其中有一列描述公司类型。我注意到专栏里有,比如外科,外科。它列出了眼镜、眼镜和验光。因此,我不想在本专栏中列出一个庞大的列表,我只想简单地列出一个类别,如果你发现一个词包含eye、Glass或opto,那么就把它改为eyewear。我的初始代码如下所示:

def map_company(row):
    company = row['SIC_Desc']
    if company in 'Surgical':
         return 'Surgical'
    elif company in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers']:
        return 'Eyewear'
    elif company in ['Cotton', 'Bandages', 'gauze', 'tape']:
        return 'First Aid'
    elif company in ['Dental', 'Denture']:
        return 'Dental'
    elif company in ['Wheelchairs', 'Walkers', 'braces', 'crutches', 'ortho']:
        return 'Mobility equipments'
    else:
        return 'Other'

df['SIC_Desc'] = df.apply(map_company,axis=1)
但这是不正确的,因为它将每个项目都转换为其他项目,所以我的语法显然是错误的。有人能帮我简化一下我想重新标注的这个专栏吗?
谢谢

如果没有数据集的确切内容,很难回答,但我可以看出一个错误。根据你的描述,看起来你看得不对。您希望其中一个词出现在您的公司描述中,因此应如下所示:

if any(test in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers'])
def is_match(company,names):
    return any(name in company for name in names)

def map_company(row):
    company = row['SIC_Desc'].lower()
    if 'surgical' in company:
         return 'Surgical'
    elif is_match(company,['eye','glasses','opthal','spectacles','optometers']):
        return 'Eyewear'
    elif is_match(company,['cotton', 'bandages', 'gauze', 'tape']):
        return 'First Aid'
    else:
        return 'Other'
但是,您可能会遇到案例问题,因此我建议:

company = row['SIC_Desc'].lower()
if any(test.lower() in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers']):
    return 'Eyewear'
您还需要确保company是一个字符串,“SIC_Desc”是一个正确的列名

最终,您的函数将如下所示:

if any(test in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers'])
def is_match(company,names):
    return any(name in company for name in names)

def map_company(row):
    company = row['SIC_Desc'].lower()
    if 'surgical' in company:
         return 'Surgical'
    elif is_match(company,['eye','glasses','opthal','spectacles','optometers']):
        return 'Eyewear'
    elif is_match(company,['cotton', 'bandages', 'gauze', 'tape']):
        return 'First Aid'
    else:
        return 'Other'

没有数据集的确切内容很难回答,但我可以看出一个错误。根据你的描述,看起来你看得不对。您希望其中一个词出现在您的公司描述中,因此应如下所示:

if any(test in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers'])
def is_match(company,names):
    return any(name in company for name in names)

def map_company(row):
    company = row['SIC_Desc'].lower()
    if 'surgical' in company:
         return 'Surgical'
    elif is_match(company,['eye','glasses','opthal','spectacles','optometers']):
        return 'Eyewear'
    elif is_match(company,['cotton', 'bandages', 'gauze', 'tape']):
        return 'First Aid'
    else:
        return 'Other'
但是,您可能会遇到案例问题,因此我建议:

company = row['SIC_Desc'].lower()
if any(test.lower() in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers']):
    return 'Eyewear'
您还需要确保company是一个字符串,“SIC_Desc”是一个正确的列名

最终,您的函数将如下所示:

if any(test in company for test in ['Eye', 'glasses', 'opthal', 'spectacles', 'optometers'])
def is_match(company,names):
    return any(name in company for name in names)

def map_company(row):
    company = row['SIC_Desc'].lower()
    if 'surgical' in company:
         return 'Surgical'
    elif is_match(company,['eye','glasses','opthal','spectacles','optometers']):
        return 'Eyewear'
    elif is_match(company,['cotton', 'bandages', 'gauze', 'tape']):
        return 'First Aid'
    else:
        return 'Other'
这里有一个使用的选项

代码

细节

我们定义了一个分别包含期望输出和关联词的键、值对的查找字典。注意,这些值是小写的,以简化搜索。然后,我们使用反向字典自动反转键值对并提高搜索性能,例如:

>>> REVERSE_LOOKUP
{'bandages': 'First Aid',
 'cotton': 'First Aid',
 'eye': 'Eyewear',
 'gauze': 'First Aid',
 ...}
请注意,这些引用字典是在mapping函数之外创建的,以避免每次调用map_company时都重新生成字典。最后,映射函数通过调用.get使用反向字典快速返回所需的输出,如果没有找到条目,该方法将返回默认参数Other

请参阅@Flynsee富有洞察力的答案,以了解代码中发生了什么。与一组条件语句相比,代码更简洁

利益

因为我们使用了字典,所以搜索时间应该相对较快,O1与中使用的复杂度相比。此外,主查找字典是可调整的,不需要为新条目手动执行大量条件语句。

这里有一个使用

代码

细节

我们定义了一个分别包含期望输出和关联词的键、值对的查找字典。注意,这些值是小写的,以简化搜索。然后,我们使用反向字典自动反转键值对并提高搜索性能,例如:

>>> REVERSE_LOOKUP
{'bandages': 'First Aid',
 'cotton': 'First Aid',
 'eye': 'Eyewear',
 'gauze': 'First Aid',
 ...}
请注意,这些引用字典是在mapping函数之外创建的,以避免每次调用map_company时都重新生成字典。最后,映射函数通过调用.get使用反向字典快速返回所需的输出,如果没有找到条目,该方法将返回默认参数Other

请参阅@Flynsee富有洞察力的答案,以了解代码中发生了什么。与一组条件语句相比,代码更简洁

利益


因为我们使用了字典,所以搜索时间应该相对较快,O1与中使用的复杂度相比。此外,主查找字典是可调整的,不需要为新条目手动执行大量的条件语句。

已经验证了进入公司的值吗?为什么不使用调试器呢?调试器是您的朋友,请把握机会学习使用调试器!你也可以发布你正在使用的数据集吗?听起来你的情况是相反的。你想和“牙医”在一起。您可以使用any来获得比较多个值所需的效果,例如:elif anyi in company for i in['Dental','Dental','Dental']:…您好Champion您可以扩展代码吗?它似乎不起作用。这就是我所拥有的:def map_companyrow:company=row['SIC_Desc']如果我在公司里为我在['Surgical','Surgical':返回'Surgical'elif anyi在公司里为我在['Eye'、'glass'、'opthal'、'眼镜'、'optometer']:返回'eyeewear'elif anyi在公司里为我在['Cotton'、'绷带'、'纱布'、'胶带']:return‘急救’else:return‘Other’df['SIC_Desc']=df.applymap_company,axis=1已验证进入公司的值?为什么不使用调试器?调试器是你的朋友,
抓住机会学习使用一个!你也可以发布你正在使用的数据集吗?听起来你的情况是相反的。你想和“牙医”在一起。您可以使用any来获得比较多个值所需的效果,例如:elif anyi in company for i in['Dental','Dental','Dental']:…您好Champion您可以扩展代码吗?它似乎不起作用。这就是我所拥有的:def map_companyrow:company=row['SIC_Desc']如果我在公司里为我在['Surgical','Surgical':返回'Surgical'elif anyi在公司里为我在['Eye'、'glass'、'opthal'、'眼镜'、'optometer']:返回'eyeewear'elif anyi在公司里为我在['Cotton'、'绷带'、'纱布'、'胶带']:返回“急救”其他:返回“其他”df['SIC_Desc']=df.applymap_company,axis=1@Chinny84哦,是的!谢谢你注意到了。编辑:我修正了它,所以你能通过写df['SIC_Desc']=df.applymap_company,axis=1来完成代码吗?我已经试过了,但它仍然将所有行列为Other@Chinny84哦,是的!谢谢你注意到了。编辑:我修正了它,所以你能通过写df['SIC_Desc']=df.applymap_company,axis=1来完成代码吗?我已经试过了,但它仍然将所有行作为其他行列出