如何从另一DataFrame返回最大值?附代码及报错问题
问题:从多代码字符串匹配参考表并提取最大值
场景说明
有两个DataFrame:
- df1:参考表,存储单个代码与对应数值的映射
- df2:大型数据集片段,其中一列包含以逗号分隔的多代码字符串,同时存在空白值、
Not Applicable这类无效值
需求:拆分df2中的每个代码字符串,匹配df1中的对应数值,在df2新增一列返回该字符串所有有效代码对应数值的最大值。
示例数据:
import pandas as pd df1 = [['H302',18], ['H312',17], ['H315',16], ['H316',15], ['H319',14], ['H320',13], ['H332',12], ['H304',11]] df1 = pd.DataFrame(df1, columns=['Code', 'Value']) df2 = [['H302,H304'], ['H332,H319,H312,H320,H316,H315,H302,H304'], ['H315,H312,H316'], ['H320,H332,H316,H315,H304,H302,H312'], ['H315,H319,H312,H316,H332'], ['H312'], ['Not Applicable'], ['']] df2 = pd.DataFrame(df2, columns=['Code'])
原代码的问题
原代码使用多层嵌套循环处理,存在以下问题:
- 性能极差:三层循环遍历,面对大型数据集时运行效率极低
- 未处理无效值:当遇到
Not Applicable或空字符串时,拆分后仍保留字符串类型,执行max()时会同时存在数值和字符串,触发报错:无法在numpy数组实例和字符串之间进行小于比较(原报错:'<' not supported between instances of 'numpy.ndarray' and 'str') - 写法不规范:手动维护列表
append的方式不符合pandas向量化操作的最佳实践
优化实现方案
利用pandas的向量化操作+字典映射,高效解决问题:
# 将df1转换为字典,实现O(1)快速查找 code_value_map = df1.set_index('Code')['Value'].to_dict() def get_max_value(code_str): # 处理无效值 if pd.isna(code_str) or code_str.strip() == '' or code_str == 'Not Applicable': return pd.NA # 或者返回0/其他默认值,根据需求调整 # 拆分代码字符串 codes = code_str.split(',') # 过滤空代码(防止拆分后出现空白项),并映射获取数值 values = [code_value_map.get(code.strip(), pd.NA) for code in codes] # 过滤无效的映射值,取最大值 valid_values = [v for v in values if pd.notna(v)] return max(valid_values) if valid_values else pd.NA # 应用到df2生成新列 df2['Max Value'] = df2['Code'].apply(get_max_value)
代码说明:
- 字典映射:将df1转为字典后,代码到数值的查找时间复杂度从O(n)降到O(1),大幅提升效率
- 无效值处理:提前判断并返回空值(或自定义默认值),避免后续类型冲突
- 过滤校验:拆分后过滤空白代码、无效映射值,确保
max()仅针对有效数值计算
运行后df2结果:
| Code | Max Value |
|---|---|
| H302,H304 | 18 |
| H332,H319,H312,H320,H316,H315,H302,H304 | 18 |
| H315,H312,H316 | 17 |
| H320,H332,H316,H315,H304,H302,H312 | 18 |
| H315,H319,H312,H316,H332 | 17 |
| H312 | 17 |
| Not Applicable | |
内容的提问来源于stack exchange,提问作者cal192
相关产品推荐
相关产品推荐

