如何在Pandas DataFrame中利用字典和子字符串匹配添加分类列

如何在Pandas DataFrame中利用字典和子字符串匹配添加分类列

本教程旨在解决如何在Pandas DataFrame中,根据一个包含关键词-类别映射的字典,为现有列动态添加一个分类列。当字典中的键是DataFrame列值中的子字符串时,直接使用map函数无法满足需求。我们将详细讲解如何利用apply函数结合自定义的lambda表达式,实现高效且灵活的子字符串匹配与分类赋值。

问题背景与挑战

在数据处理中,我们经常需要根据文本描述为数据项添加类别标签。一个常见的场景是,我们拥有一个包含关键词及其对应类别的字典,以及一个dataframe,其中某一列的文本值包含这些关键词。例如,我们有一个商品名称列表,希望根据商品名称中的特定词汇(如“apple”、“grape”)将其归类为“fruit”。

直接使用Pandas的map函数进行字典映射是处理一对一精确匹配的常用方法。然而,当字典的键不是DataFrame列值的精确匹配,而是其子字符串时,map函数将无法直接应用。例如,如果字典是{‘apple’: ‘fruit’},而DataFrame中的项是’apple from happy orchard’,直接df[‘Item’].map(category_dict)将返回NaN,因为它无法找到完全匹配的键。

解决方案:结合apply与自定义匹配逻辑

为了解决子字符串匹配的问题,我们可以利用Pandas DataFrame的apply方法,结合一个自定义的lambda函数。这个lambda函数将遍历字典中的所有键值对,检查字典的键是否作为子字符串存在于DataFrame的当前单元格中。

1. 准备数据与字典

首先,我们定义用于映射的字典和示例DataFrame:

import pandas as pd# 类别字典,键是关键词,值是类别category_dict = {    'apple': 'fruit',    'grape': 'fruit',    'chickpea': 'beans',    'coffee cup': 'tableware'}# 示例DataFramedata = {    '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)

2. 应用自定义匹配函数

核心的解决方案在于使用df[‘Item’].apply()方法。apply方法会对DataFrame指定列的每一个元素执行一个函数。在这里,我们传递一个lambda函数,该函数接收列中的每个字符串x作为输入,并执行以下逻辑:

遍历字典项: for key, value in category_dict.items() 遍历字典中的每一个关键词和类别。子字符串匹配: if key in x 检查当前的关键词key是否是当前DataFrame项x的子字符串。获取第一个匹配项: next((value for key, value in category_dict.items() if key in x), None) 这行代码使用了一个生成器表达式。它会寻找第一个满足key in x条件的键值对,并返回其对应的value。如果没有任何键匹配成功,next函数将返回其第二个参数None。

# 应用自定义函数添加 'Category' 列df['Category'] = df['Item'].apply(    lambda x: next((value for key, value in category_dict.items() if key in x), None))print("n添加 'Category' 列后的DataFrame:")print(df)

输出结果:

原始DataFrame:                          Item  Cost0     apple from happy orchard    151   grape from random vineyard    202  chickpea and black bean mix    103    coffee cup with dog decal    14添加 'Category' 列后的DataFrame:                          Item  Cost   Category0     apple from happy orchard    15      fruit1   grape from random vineyard    20      fruit2  chickpea and black bean mix    10      beans3    coffee cup with dog decal    14  tableware

注意事项与进阶考量

性能考量: 对于非常大的DataFrame和/或字典,apply方法在Python循环中执行,可能不是最高效的。如果性能成为瓶颈,可以考虑以下优化:

正则表达式 使用str.contains()结合正则表达式进行匹配,这通常在C语言层面实现,性能更优。向量化操作: 如果可能,将字典转换为更适合向量化操作的结构。预处理: 如果字典键的数量非常大,可以考虑构建一个Trie树或其他字符串搜索数据结构来加速匹配。

匹配优先级: next()函数会返回第一个找到的匹配项。如果一个DataFrame项可以匹配字典中的多个键(例如,”apple pie”可以匹配”apple”和”pie”),则字典中迭代顺序靠前的键会优先匹配。如果需要特定的优先级,应确保字典的键按照所需的优先级顺序排列(例如,将更具体的键放在前面,或对字典键进行排序)。

无匹配项处理: 当前代码中,如果DataFrame中的项没有匹配到字典中的任何关键词,Category列将赋值为None。你可以根据需求修改next函数的默认值,例如将其设置为’Other’或保留为pd.NA。

# 示例:无匹配项时赋值为 'Unknown'df['Category_with_unknown'] = df['Item'].apply(    lambda x: next((value for key, value in category_dict.items() if key in x), 'Unknown'))

大小写敏感性: key in x 是大小写敏感的。如果需要进行大小写不敏感的匹配,应在比较前将key和x都转换为小写:

df['Category_case_insensitive'] = df['Item'].apply(    lambda x: next((value for key, value in category_dict.items() if key.lower() in x.lower()), None))

总结

通过灵活运用Pandas的apply函数结合自定义的lambda表达式,我们可以有效地解决在DataFrame中基于字典进行子字符串匹配并添加分类列的问题。这种方法提供了一种强大且可定制的解决方案,适用于各种复杂的文本数据分类场景。在实际应用中,根据数据规模和性能需求,可以进一步考虑优化匹配逻辑和算法。

以上就是如何在Pandas DataFrame中利用字典和子字符串匹配添加分类列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 13:22:47
下一篇 2025年12月14日 13:23:06

相关推荐

  • python决策树算法的实现步骤

    答案是实现决策树需依次完成数据预处理、训练集划分、模型构建与训练、预测评估四步,使用scikit-learn库可高效完成,关键在于数据清洗、特征编码、参数设置及结果可视化,全过程强调逻辑清晰与细节把控。 实现Python中的决策树算法并不复杂,关键在于理解每一步的逻辑和操作。以下是基于scikit-…

    2025年12月14日
    000
  • python按行读取文件的方法比较

    readlines()适合小文件且需索引访问;2. for line in f最推荐,内存高效;3. readline()可精确控制但代码繁琐;4. 生成器适合超大文件。日常优先用for循环读取,避免内存浪费。 Python中按行读取文件有多种方法,每种方式在内存使用、速度和适用场景上有所不同。下面…

    2025年12月14日
    000
  • Python特殊传参如何实现

    Python中通过args和kwargs实现灵活传参,args将位置参数打包为元组,kwargs将关键字参数打包为字典,二者可组合使用并遵循普通→默认→args→kwargs的顺序,调用时可用和拆包序列或字典传递参数,广泛应用于装饰器、封装及通用接口设计。 Python中的特殊传参机制让函数调用更灵…

    2025年12月14日
    000
  • python中popitem如何使用

    popitem()方法从字典末尾移除并返回键值对,适用于清空字典场景。示例:my_dict = {‘a’: 1, ‘b’: 2, ‘c’: 3};item = my_dict.popitem()返回(‘c&#8217…

    2025年12月14日
    000
  • python命名关键字参数的使用注意

    命名关键字参数必须通过关键字传递,使用星号*分隔位置参数与关键字参数,确保调用时显式传参,提升函数接口清晰度和安全性。 在Python中,命名关键字参数(keyword-only arguments)是指必须通过关键字传递的参数,不能通过位置传递。这种参数定义方式增强了函数调用的清晰性和安全性。正确…

    2025年12月14日
    000
  • python中mock的断言使用

    答案:Python中使用unittest.mock的断言方法验证模拟对象调用情况,如assert_called_once_with检查调用次数和参数。通过@mock.patch替换目标方法,结合call_count和assert_any_call可验证多次调用的参数,确保函数行为正确。 在Pytho…

    2025年12月14日 好文分享
    000
  • splitlines在python中返回列表

    splitlines()方法按行分割字符串并返回列表,能识别n、rn、r等换行符,默认不保留换行符,传入keepends=True可保留;常用于读取文件、处理用户输入或多行文本解析,与split(‘n’)不同,末尾换行不会产生空字符串,适用于跨平台场景。 在 Python 中…

    2025年12月14日
    000
  • Langserve中实现动态RAG应用:Langchain链式输入处理教程

    本教程详细阐述如何在langserve中构建支持动态输入的rag(检索增强生成)应用。文章通过langchain的runnable接口,展示如何将用户查询和目标语言作为动态参数传递给检索器和llm提示模板,从而实现灵活、可配置的交互式ai服务。内容涵盖链式组件的构建、langserve路由配置及示例…

    2025年12月14日
    000
  • Selenium自动化中循环操作的元素定位与显式等待策略

    本文旨在解决selenium自动化脚本在循环操作中遇到的“元素未找到”问题,特别是当页面动态加载或导航后。我们将深入探讨隐式等待的局限性,并详细介绍如何通过引入selenium的显式等待机制(`webdriverwait`与`expected_conditions`)来确保元素在交互前处于可操作状态…

    2025年12月14日
    000
  • 正则表达式中特殊字符|的匹配陷阱与解决方案

    在正则表达式中,竖线符号`|`被视为逻辑“或”运算符,而非普通字符。当需要匹配字符串中的字面竖线时,必须使用反斜杠“进行转义,即`|`。本文将深入探讨这一常见误区,并通过python `re`模块的示例代码,演示如何正确处理`|`等特殊字符,确保正则表达式的行为符合预期。 理解正则表达式…

    2025年12月14日
    000
  • Python实现Excel文件整文件密码保护的专业指南

    本教程旨在解决python开发中,使用`pandas`生成excel文件后,实现整文件密码保护的难题。针对`openpyxl`和`xlsxwriter`等库仅支持工作表加密的局限,本文推荐并详细讲解如何结合外部工具`msoffice-crypt`,通过python的`subprocess`模块实现跨…

    2025年12月14日
    000
  • Dash应用中通过URI片段实现选项卡间导航与同步

    本文将详细介绍如何在dash多选项卡应用中,利用`dcc.location`组件和回调函数,通过uri片段(url哈希值)实现选项卡之间的导航与状态同步。用户可以通过点击链接激活不同的选项卡,同时确保url与当前活动选项卡状态保持一致,提升用户体验和应用的鲁棒性。 在构建复杂的Dash应用程序时,多…

    2025年12月14日
    000
  • Python库安装故障排除:解决pywinpty和sklearn警告与正确实践

    在Python开发中,通过pip安装库时常会遇到警告信息,即使最终显示“所有需求已满足”,也可能存在潜在问题。本文将深入探讨如何诊断并解决常见的安装警告,特别是针对`pywinpty`的编译依赖问题和`sklearn`的包名弃用警告,并提供一套通用的故障排除流程,确保您的Python环境稳定且库正确…

    2025年12月14日
    000
  • 解决Mypy在cached_property派生类中类型推断不一致的问题

    本文探讨了在使用`functools.cached_property`的派生类时,mypy类型检查器行为不一致的问题。当直接使用`cached_property`时,mypy能正确推断类型错误,但继承后则可能失效。核心原因在于mypy对内置装饰器与自定义装饰器的类型推断机制差异。解决方案是通过将派生…

    2025年12月14日
    000
  • Tkinter 文件与文件夹选择:实现灵活的文件系统路径输入

    tkinter的`filedialog`模块通常将文件和文件夹选择功能分开。本文将介绍一种实用的方法,通过组合`askopenfilename`和`askdirectory`函数,实现一个统一的对话框,允许用户灵活选择文件或文件夹,从而优化用户体验并简化路径输入流程。 引言:Tkinter 文件系统…

    2025年12月14日
    000
  • 在 macOS 上使用 PyObjC 实现 MPEG-4 音频文件的拖放功能

    本文详细介绍了如何在 macos 环境下,利用 pyobjc 框架实现应用程序的拖放功能,特别是针对 mpeg-4 音频文件的处理。文章阐述了正确注册拖放类型(如 `public.audio`、`public.mpeg-4-audio` 及 url/文件 url 类型)的重要性,并提供了从拖放操作中…

    2025年12月14日
    000
  • 使用 Ruff 在指定目录中忽略特定规则

    本文介绍了如何使用 Ruff 工具在 Python 项目中,针对特定目录或文件,忽略指定的规则。通过 pyproject.toml 配置文件中的 per-file-ignores 设置,可以灵活地控制 Ruff 的检查行为,例如忽略测试目录下的文档字符串规范检查。 Ruff 是一款快速的 Pytho…

    2025年12月14日
    000
  • 使用 Python 实现矩阵的行阶梯形变换

    本文详细介绍了如何使用 Python 实现矩阵的行阶梯形变换,重点在于避免使用任何内置函数,并提供详细的代码示例和步骤说明,帮助读者理解算法原理并掌握实现方法。文章还包含了关于部分主元法和数值稳定性的讨论,以及最终代码的输出示例。 矩阵行阶梯形变换的原理 矩阵的行阶梯形(Row Echelon Fo…

    2025年12月14日
    000
  • 在Pandas DataFrame中高效生成重复序列与组合数据

    本教程详细介绍了如何在Pandas DataFrame中高效生成具有重复值和递增序列的列。文章通过构建列表再转换为DataFrame的方法,解决了在循环中创建DataFrame的低效问题,并探讨了使用`itertools.product`等更Pandas风格的解决方案,旨在帮助用户掌握数据框列的灵活…

    2025年12月14日
    000
  • Dash Python:实现多标签页应用中的内部链接导航

    本教程详细介绍了如何在dash多标签页应用中,通过点击页面内的超链接来激活不同的标签页。核心方法是利用`dcc.location`组件管理uri片段(hash),并结合回调函数同步`dcc.location`的`hash`属性与`dbc.tabs`的`active_tab`属性,从而实现基于url状…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信