x.split抛出IndexError: list index out of range,max_salary计算报错如何解决
问题根因
- 核心触发逻辑:你调用
split('-')拆分字符串时,部分行的待拆分内容拆分后返回的列表长度仅为1,访问索引[1]时自然触发越界错误。min_salary计算无异常是因为哪怕拆分后只有1个元素,索引[0]也可以正常取值。 - 常见异常场景:
- 部分行薪资无区间,为单个数值,比如
"90"、"120以上" - 部分行的区间分隔符不是半角横杠
-,比如使用了全角横杠-、波浪线~等 - 部分行是异常值,比如空字符串、
"薪资面议"等非数值内容
- 部分行薪资无区间,为单个数值,比如
- 额外排查点:你当前代码中两次apply的数据源均为
min_hr,如果该变量不是原始薪资列的别名,也可能是该变量提前被截断处理,丢失了横杠后的内容。
解决步骤
- 先定位所有异常值,运行以下代码输出所有拆分异常的行:
# 输出所有拆分后长度不足2的异常内容 print(min_hr[min_hr.apply(lambda x: len(x.split('-')) < 2)])
- 根据异常值情况选择对应处理方案:
- 若为分隔符不统一:先统一替换分隔符再加兜底逻辑处理单值情况
# 统一替换全角横杠、波浪线为半角横杠 min_hr = min_hr.str.replace('-|~', '-', regex=True) # 拆分时加判断,单值情况下最高薪资等于最低薪资 df2['min_salary'] = min_hr.apply(lambda x: int(x.split('-')[0].strip())) df2['max_salary'] = min_hr.apply(lambda x: int(x.split('-')[1].strip()) if len(x.split('-')) >=2 else int(x.split('-')[0].strip()))
- 若存在大量非数值异常值:用自定义函数统一处理,异常值返回空
import pandas as pd def parse_salary(salary_str): parts = salary_str.split('-') # 提取纯数字部分 num_parts = [p.strip() for p in parts if p.strip().isdigit()] if len(num_parts) == 2: return int(num_parts[0]), int(num_parts[1]) elif len(num_parts) == 1: return int(num_parts[0]), int(num_parts[0]) else: return None, None df2[['min_salary', 'max_salary']] = min_hr.apply(lambda x: pd.Series(parse_salary(x)))
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

