You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas匹配两个DataFrame列并返回另一列值的问题

解决DataFrame匹配Description列添加Category时全为NaN的问题

你遇到的核心问题是字符串匹配不严格,导致map方法找不到对应匹配项,最终返回全NaN。以下是具体解决方案:

场景与示例数据

df1(银行交易记录)

Description, Amount    
Corner Store, 30
Cinema, 10
Trampoline Store, 20

df2(自定义分类表)

Description, Category
Corner Store, Groceries
Cinema, Recreation
The Pub, Alcohol

期望结果

Description, Amount, Category
Corner Store, 30, Groceries
Cinema, 10, Recreation
Trampoline Store, 20,

问题原因

你原本的代码逻辑本身是正确的,但实际数据中df1['Description']和df2['Description']大概率存在隐形差异:比如字符串前后有空格、大小写不一致、全角/半角字符混存等,导致完全匹配失败,最终返回NaN。

解决方案

方案1:清洗字符串后使用map

先统一处理两个表的Description列,消除隐形差异,再用map匹配,最后将NaN替换为空字符串:

import pandas as pd

# 读取CSV文件
df1 = pd.read_csv('银行交易记录.csv')
df2 = pd.read_csv('自定义分类.csv')

# 清洗字符串:去除前后空白、统一大小写(大小写统一可选,根据实际需求调整)
df1['Description'] = df1['Description'].str.strip().str.lower()
df2['Description'] = df2['Description'].str.strip().str.lower()

# 构建分类映射字典并匹配
category_map = df2.set_index('Description')['Category']
df1['Category'] = df1['Description'].map(category_map).fillna('')

方案2:使用merge左连接(更直观)

用merge做左连接,保留df1所有行的同时匹配df2的分类,同样先清洗字符串:

import pandas as pd

df1 = pd.read_csv('银行交易记录.csv')
df2 = pd.read_csv('自定义分类.csv')

# 清洗字符串
df1['Description'] = df1['Description'].str.strip()
df2['Description'] = df2['Description'].str.strip()

# 左连接匹配,空值填充为空字符串
df1 = df1.merge(df2, on='Description', how='left').fillna({'Category': ''})

两种方案都能解决问题:merge方法逻辑更直观,适合新手;map方法性能略优,适合大数据量场景。

内容的提问来源于stack exchange,提问作者mapface

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:20:25