Pandas DataFrame循环匹配赋值触发TypeError问题求助
问题分析与解决方案
错误核心原因
报错TypeError: 'in <string>' requires string as left operand, not int的本质是类型不匹配:
check_df["V_ORG_UNIT_CODE"]存储的是整数类型(int)in_df["MergedColumn"]是字符串类型(str)
Python不允许直接判断整数是否包含在字符串中,必须先把整数转为字符串才能进行匹配。
同时你的代码还有两个逻辑缺陷:
- 使用
Series.append(z)赋值会覆盖整列数据,且无法对应到check_df的正确行 - 嵌套循环效率极低,数据量大时会严重拖慢运行速度
修复方案
方案1:修正嵌套循环(适合小数据集)
先解决类型问题,再调整赋值逻辑,确保匹配结果对应到check_df的正确行:
import pandas as pd # 初始化空列(若未初始化) check_df['V_ORG_UNIT_NAME_LEVEL14'] = pd.NA # 遍历check_df的每一行,通过索引定位赋值 for idx, x in check_df["V_ORG_UNIT_CODE"].items(): # 将整数转为字符串 x_str = str(x) # 遍历in_df查找匹配项 for y, z in zip(in_df["MergedColumn"], in_df["OutputDisplay"]): if x_str in y: check_df.loc[idx, 'V_ORG_UNIT_NAME_LEVEL14'] = z # 找到匹配后跳出内层循环,避免重复赋值 break
方案2:矢量化操作(推荐,适合大数据集)
利用Pandas的矢量化方法替代嵌套循环,大幅提升运行效率:
import pandas as pd # 将整数代码转为字符串 check_df['V_ORG_UNIT_CODE_STR'] = check_df['V_ORG_UNIT_CODE'].astype(str) # 定义匹配函数:根据代码查找对应的OutputDisplay def find_match(code): # 筛选MergedColumn包含该代码的行,排除空值 matches = in_df[in_df['MergedColumn'].str.contains(code, na=False)] # 返回第一个匹配结果,无匹配则返回NA return matches['OutputDisplay'].iloc[0] if not matches.empty else pd.NA # 批量应用函数到check_df的每一行 check_df['V_ORG_UNIT_NAME_LEVEL14'] = check_df['V_ORG_UNIT_CODE_STR'].apply(find_match) # 删除临时辅助列 check_df.drop('V_ORG_UNIT_CODE_STR', axis=1, inplace=True)
方案3:映射字典匹配(适合in_df无重复匹配项的场景)
如果in_df中每个代码仅对应一个OutputDisplay,可以先构建映射字典,实现快速匹配:
import pandas as pd # 构建代码到名称的映射字典 code_name_map = {} for merged_str, display_name in zip(in_df['MergedColumn'], in_df['OutputDisplay']): # 遍历check_df的所有字符串格式代码,匹配后存入字典 for code in check_df['V_ORG_UNIT_CODE'].astype(str): if code in merged_str: code_name_map[code] = display_name # 用map方法批量赋值,无匹配项填充NA check_df['V_ORG_UNIT_NAME_LEVEL14'] = check_df['V_ORG_UNIT_CODE'].astype(str).map(code_name_map).fillna(pd.NA)
关键注意事项
- 若
in_df["MergedColumn"]存在空值,使用str.contains时需加上na=False避免报错 - 若存在多个匹配项,需根据业务需求调整逻辑(比如取第一个、拼接所有结果等)
- 大数据集优先选择方案2或3,嵌套循环仅适合小规模数据场景
内容的提问来源于stack exchange,提问作者Saumya Shah
相关产品推荐
相关产品推荐

