Pandas使用map方法映射匹配时如何忽略大小写敏感性
问题描述
现有两个Pandas DataFrame:
import pandas as pd df1 = pd.DataFrame({'Item': ["jetties","Jetty", "Joint use"], 'Team': ["Team_1", "Team_2", "Team_1"]}) df2 = pd.DataFrame({'Item': ["Jetty","Jetties","Joint use"]})
初始使用map方法做匹配的代码如下:
df2['Team'] = df2['Item'].map(df1.set_index('Item')['Team'])
匹配结果参考:
该匹配逻辑默认大小写敏感,因此Jetties(首字母大写)和df1中存储的jetties(全小写)无法匹配,对应Team列返回NaN,需要实现匹配时忽略大小写的效果。
实现方法
核心思路是匹配时统一两边的字符串大小写(全转小写/全转大写均可),不修改原始存储的Item值,避免破坏原始数据。
方法1:改造映射逻辑(推荐,写法简洁)
先将df1的映射键统一转为小写构建映射字典,匹配时将df2的待匹配值也转为小写,即可绕过大小写差异完成匹配:
# 构建大小写不敏感的映射字典,键统一为Item的小写格式 case_insensitive_map = df1.assign( match_key=df1['Item'].str.lower() ).set_index('match_key')['Team'].to_dict() # 匹配时将待匹配字段统一转小写再查映射 df2['Team'] = df2['Item'].str.lower().map(case_insensitive_map)
运行后结果:
| Item | Team |
|---|---|
| Jetty | Team_2 |
| Jetties | Team_1 |
| Joint use | Team_1 |
注意:如果df1中存在大小写不同但小写后完全一致的重复Item,构建字典时会默认保留最后一条对应的Team值,这类重复数据建议提前做去重处理。
方法2:左连接匹配
如果不想用map,也可以通过给两个表都加统一大小写的临时匹配键,用左连接完成匹配后删除临时列:
df2 = df2.assign( match_key=df2['Item'].str.lower() ).merge( df1.assign(match_key=df1['Item'].str.lower()), on='match_key', how='left' ).drop(columns='match_key')
该方法逻辑更直观,适合需要同时匹配多列的场景。
内容的提问来源于stack exchange,提问作者toerag
相关产品推荐
相关产品推荐

