Joblib并行处理使用非有序列表时触发IndexError的问题排查
问题分析与解决
核心问题
你的错误和列表有序性无关,直接原因是B_df[i]的索引方式错误:当i是22、23这类值时,你误将unit的取值当成了数据框的行位置/索引,而非筛选条件,导致触发IndexError。
具体解释
- 对于A_df,
a.unit.unique()的取值是0-15,刚好和数据框默认的行位置索引(从0开始)匹配,所以A_df[i]能正常取到对应行; - 对于B_df,
b.unit.unique()包含22、23,但B_df的行位置索引大概率没有到22(比如数据总行数不足22),或者行标签索引不包含这些值,此时B_df[i]会被pandas解析为位置索引,自然会出现“列表索引越界”的错误。
修复代码
把直接用i索引数据框的写法,改成按unit列筛选对应行:
res_a = Parallel(n_jobs=-1, backend='loky', verbose=5)( delayed(Class_A.func)(A_df[A_df['unit'] == i]) for i in a.unit.unique().tolist() ) res_b = Parallel(n_jobs=-1, backend='loky', verbose=5)( delayed(Class_A.func)(B_df[B_df['unit'] == i]) for i in b.unit.unique().tolist() ) res_c = Parallel(n_jobs=-1, backend='loky', verbose=5)( delayed(Class_A.func)(C_df[C_df['unit'] == i]) for i in c.unit.unique().tolist() )
额外建议
如果unit列是数据框的行索引,那可以保留B_df.loc[i](明确使用标签索引),而非直接B_df[i],避免pandas混淆位置索引和标签索引。
内容的提问来源于stack exchange,提问作者KG_backport
相关产品推荐
相关产品推荐

