如何利用字典为DataFrame添加分类列?
问题分析
你之前的代码用df['Item'].map(dict)是完全匹配Item列的完整字符串,但你的Item列是包含字典键的长文本,自然无法匹配,会返回NaN。要解决这个问题,需要改成包含匹配的逻辑——检查Item文本中是否存在字典的键,再返回对应的分类。
另外注意:不要用dict作为变量名,它是Python内置类型,会覆盖原有功能,建议改成category_map这类名称。
解决方案
方案一:apply+自定义函数(逻辑直观)
遍历每个Item文本,检查是否包含字典中的键,找到匹配项后返回对应分类:
import pandas as pd # 重命名字典,避免覆盖内置类型 category_map = {'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) # 自定义匹配函数 def get_category(item_text): for key, category in category_map.items(): if key in item_text: return category return None # 无匹配时返回None,可替换为默认值如'unknown' # 添加分类列 df['Category'] = df['Item'].apply(get_category)
方案二:正则提取+映射(效率更高)
把字典的键转成正则备选模式,提取出匹配的键后再映射分类,适合数据量较大的场景:
import pandas as pd category_map = {'apple':'fruit', 'grape':'fruit', 'chickpea':'beans','coffee cup':'tableware'} 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) # 把字典键转成正则模式,长键放前面避免短键优先匹配(比如先匹配'coffee cup'而非'cup') pattern = '|'.join(sorted(category_map.keys(), key=len, reverse=True)) # 提取匹配的键 df['matched_key'] = df['Item'].str.extract(f'({pattern})', expand=False) # 映射得到分类 df['Category'] = df['matched_key'].map(category_map) # 可删除临时列 df = df.drop('matched_key', axis=1)
两种方案都能得到你需要的结果:
| Item | Cost | Category |
|---|---|---|
| apple from happy orchard | 15 | fruit |
| grape from random vineyard | 20 | fruit |
| chickpea and black bean mix | 10 | beans |
| coffee cup with dog decal | 14 | tableware |
内容的提问来源于stack exchange,提问作者sinkholeplan
相关产品推荐
相关产品推荐

