如何基于嵌套字典结合国家代码替换DataFrame字符串
解决方案:基于国家匹配的后缀替换
我来帮你修正这个问题,你的核心需求是仅当DataFrame的Reg Country Code匹配字典外层key时,才对Name列结尾的对应后缀进行替换,原来的代码因为循环逻辑错误和效率问题没有达到预期,下面是适配大字典和大数据量的优化方案:
1. 完整可运行代码
import pandas as pd # 你的嵌套规则字典 country_dict = { 'IND': {' PVT. LTD.': ' Pvt. Ltd.', ' pvt. Ltd': ' Pvt. Ltd.', ' PVT LTD': ' Pvt. Ltd.', ' L.L.P.': ' LLP', ' LTD.': ' Ltd.', ' LLP.': ' LLP', ' ltd': ' Ltd.', ' llp': ' LLP'}, 'GBR': {' P.L.C.': ' PLC', ' C.I.C.': ' CIC', ' p.l.c': ' PLC', ' c.i.c': ' CIC', ' s.e.': ' SE', ' PLC.': ' PLC'}, 'USA': {' LTD. CO.': ' Ltd. Co.', ' L.L.L.P.': ' LLLP', ' ltd. Co': ' Ltd. Co.', ' l.l.l.p': ' LLLP', ' L.L.P.': ' LLP', ' L.L.C.': ' LLC', ' l.l.p': ' LLP', ' l.l.c': ' LLC'} } # 示例DataFrame data = { 'Name': ['NexPoint LTD. CO.', 'Silverplay P.L.C.', 'ALLOYS PVT. LTD.', 'GALLIUM ltd.', 'ELLIOTT s.e.'], 'Reg Country Code': ['USA', 'GBR', 'IND', 'IND', 'GBR'] } df = pd.DataFrame(data) # 定义单个名称的处理函数:按规则替换结尾后缀 def process_single_name(name, country_rules): # 按后缀长度倒序排序,避免短后缀优先匹配(比如先匹配"LTD. CO."而不是"CO.") sorted_rules = sorted(country_rules.items(), key=lambda x: -len(x[0])) for suffix, replacement in sorted_rules: if name.endswith(suffix): # 替换结尾的后缀部分 return name[:-len(suffix)] + replacement # 无匹配后缀则返回原名称 return name # 按国家代码分组,应用对应规则 df['Name'] = df.groupby('Reg Country Code')['Name'].transform( lambda group: group.apply(lambda x: process_single_name(x, country_dict.get(group.name, {}))) ) print(df)
2. 代码运行结果
Name Reg Country Code 0 NexPoint Ltd. Co. USA 1 Silverplay PLC GBR 2 ALLOYS Pvt. Ltd. IND 3 GALLIUM Ltd. IND 4 ELLIOTT SE GBR
3. 原代码问题分析
- 循环逻辑错误:你遍历
country_dict.items()时,k1是(key-value)元组而非国家代码字符串,导致df.loc[i, 'Reg Country Code'] == k1永远不成立,规则根本没触发。 - 效率低下:逐行循环
for i in range(len(df))的方式在数据量大时会非常慢,不适合生产环境。 - 替换不精准:使用
re.sub会替换整个字符串中的匹配内容,而非仅结尾的后缀,不符合你的需求。
4. 优化方案优势
- 精准匹配国家:通过
groupby('Reg Country Code')分组,确保每个国家的行只应用对应规则,完全满足你的匹配条件。 - 高效处理:利用Pandas的向量化/分组操作替代逐行循环,处理大字典和大数据量时性能提升明显。
- 避免错误替换:对规则按后缀长度倒序排序,优先匹配长后缀,防止短后缀提前匹配导致的错误(比如避免把"LTD. CO."误拆成"LTD."替换)。
- 精准替换结尾:使用
endswith判断后缀,再通过字符串切片替换,比正则表达式更高效且精准。
内容的提问来源于stack exchange,提问作者user14613954
相关产品推荐
相关产品推荐

