讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

使用Python Pandas通过字典实现DataFrame列的模糊分类

酷宇同学_6024

酷宇同学_6024

发布时间:2025-09-25 12:28:57

|

516人浏览过

|

来源于php中文网

原创

使用Python Pandas通过字典实现DataFrame列的模糊分类

本文将详细介绍如何利用Python Pandas库,结合字典和apply函数,为DataFrame添加基于子字符串匹配的分类列。当DataFrame的原始数据项并非字典键的精确匹配,而是包含字典键作为子字符串时,传统的map方法会失效。本教程将提供一种高效且灵活的解决方案,通过自定义匹配逻辑实现动态分类,确保即使数据描述性文本较长也能准确地将项目归类。

理解挑战:为什么直接map行不通?

在数据处理中,我们经常需要根据一个查找表(通常是python字典)来为dataframe的某一列添加新的分类信息。当dataframe列中的值与字典的键完全匹配时,pandas的map函数是一个非常高效且简洁的选择。例如:

import pandas as pd

# 示例数据和字典
data = {'Item': ['apple', 'grape'], 'Cost': [15, 20]}
df_exact = pd.DataFrame(data)
category_dict_exact = {'apple': 'fruit', 'grape': 'fruit'}

# 直接使用map
df_exact['Category'] = df_exact['Item'].map(category_dict_exact)
print("直接map的结果:")
print(df_exact)

然而,实际数据往往更为复杂。当DataFrame的Item列包含的字符串是字典键的“描述性”文本,而非精确键本身时(例如,“apple from happy orchard”而不是“apple”),map函数将无法找到匹配项,通常会返回NaN。这就是我们需要更灵活的匹配策略的原因。

解决方案核心:apply与自定义匹配逻辑

为了解决子字符串匹配的问题,我们可以结合使用DataFrame的apply方法和Python的生成器表达式。apply方法允许我们对DataFrame的每一行或每一列应用一个自定义函数。通过传入一个lambda函数,我们可以为每一项数据编写特定的匹配逻辑。

核心思想是:对于DataFrame Item 列中的每个字符串,遍历分类字典的键值对。如果字典的键作为子字符串存在于当前的Item字符串中,则返回对应的类别值。

逐步实现:代码示例

下面我们将通过一个完整的代码示例来演示如何实现这一功能。

立即学习“Python免费学习笔记(深入)”;

1. 定义分类字典和原始DataFrame

首先,我们需要定义我们的分类字典和待处理的DataFrame。

import pandas as pd

# 定义分类字典
# 注意:这里将字典命名为 category_dict 以避免与Python内置的dict关键字冲突
category_dict = {
    'apple': 'fruit',
    'grape': 'fruit',
    'chickpea': 'beans',
    'coffee cup': 'tableware'
}

# 定义原始DataFrame
data = {
    'Item': [
        'apple from happy orchard',
        'grape from random vineyard',
        'chickpea and black bean mix',
        'coffee cup with dog decal'
    ],
    'Cost': [15, 20, 10, 14]
}
df = pd.DataFrame(data)

print("原始DataFrame:")
print(df)
print("\n分类字典:")
print(category_dict)

2. 应用分类逻辑

接下来,我们将使用apply方法和lambda函数来创建新的Category列。

# 应用自定义匹配逻辑来创建 'Category' 列
# 对于df['Item']中的每个元素x,我们遍历category_dict中的所有键值对(key, value)。
# 如果key作为子字符串存在于x中 (key in x),我们就返回对应的value。
# next()函数会返回第一个匹配到的value。
# 如果没有匹配到任何key,next()的第二个参数None会被返回。
df['Category'] = df['Item'].apply(
    lambda x: next((value for key, value in category_dict.items() if key in x), None)
)

print("\n处理后的DataFrame:")
print(df)

3. 结果输出

运行上述代码,您将得到一个新增了Category列的DataFrame,其中每个Item都根据其包含的子字符串被正确分类。

原始DataFrame:
                          Item  Cost
0     apple from happy orchard    15
1   grape from random vineyard    20
2  chickpea and black bean mix    10
3    coffee cup with dog decal    14

分类字典:
{'apple': 'fruit', 'grape': 'fruit', 'chickpea': 'beans', 'coffee cup': 'tableware'}

处理后的DataFrame:
                          Item  Cost   Category
0     apple from happy orchard    15      fruit
1   grape from random vineyard    20      fruit
2  chickpea and black bean mix    10      beans
3    coffee cup with dog decal    14  tableware

关键点解析

  • df['Item'].apply(lambda x: ...): 这表示对df的Item列中的每一个元素x执行lambda函数中定义的逻辑。
  • next((value for key, value in category_dict.items() if key in x), None): 这是实现模糊匹配的核心。
    • for key, value in category_dict.items(): 遍历字典中的所有键值对。
    • if key in x: 检查当前字典键key是否是DataFrame元素x的子字符串。
    • (value for ...): 这是一个生成器表达式,它会生成所有匹配到的value。
    • next(..., None): next()函数用于从生成器中获取下一个元素。它会立即返回第一个匹配到的value,从而避免不必要的后续检查。如果生成器为空(即没有找到任何匹配的key),它将返回第二个参数None。

注意事项与优化

  1. 匹配顺序的重要性: 如果字典中存在重叠的键(例如,{'apple': 'fruit', 'red apple': 'red_fruit'}),next()函数会返回第一个匹配到的结果。这意味着字典的遍历顺序可能会影响结果。在Python 3.7+中,字典会保留插入顺序。如果对匹配顺序有严格要求,请确保字典键的定义顺序是合理的(例如,更具体的键放在前面)。

  2. 处理无匹配项: 当前代码在没有找到匹配项时会返回None。您可以根据需求将其替换为其他默认值,例如'Unknown'或空字符串,只需修改next()函数的第二个参数即可。

    df['Category'] = df['Item'].apply(
        lambda x: next((value for key, value in category_dict.items() if key in x), 'Unknown')
    )
  3. 性能考虑: 对于非常大的DataFrame和/或包含大量键的字典,apply方法结合循环可能会在性能上有所限制,因为它本质上是Python级别的循环。对于性能要求极高的场景,可以考虑以下优化:

    • 向量化字符串方法: 如果您的匹配模式相对简单(例如,固定前缀/后缀),Pandas提供了一些向量化的字符串方法(如str.contains、str.extract),它们通常比apply更快。但对于任意子字符串匹配,apply通常是更灵活的选择。
    • 预编译正则表达式: 如果字典键非常多且复杂,可以考虑使用正则表达式,并预编译它们以提高效率。
    • 并行化: 对于非常大的数据集,可以考虑使用Dask或multiprocessing库进行并行处理。
  4. 大小写敏感性: key in x是大小写敏感的。如果需要进行大小写不敏感的匹配,可以将x和key都转换为小写(或大写)再进行比较:if key.lower() in x.lower()。

总结

通过结合使用Pandas的apply方法和Python的生成器表达式,我们可以优雅地解决DataFrame列与字典键之间的子字符串匹配问题,从而为数据添加灵活且准确的分类信息。这种方法不仅适用于本例中的商品分类,也广泛应用于文本分析、日志处理等多种场景,是数据清洗和特征工程中一个非常实用的技巧。理解其工作原理和注意事项,将有助于您更高效地处理复杂的数据分类任务。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4916

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3361

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9402

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

520

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn