处理DataFrame列表列时触发IndexError: list index out of range的解决方法
解决DataFrame列表列索引越界并填充空值的方法
问题原因
你的NVD列包含空列表或长度不足的列表,当直接使用x[1]这类索引取值时,列表长度小于目标索引位置就会触发IndexError: list index out of range。
解决方案
下面提供两种实用的处理方式:
方法1:逐列通过apply安全取值
使用lambda表达式结合长度判断,为空列表/长度不足的行填充pd.NA(或np.nan):
import pandas as pd # 保留你的初始处理代码 poam = pd.read_excel('NetApp-RET-NVD_V1.xlsx', header = 0) new_poam = poam[["POAM ID ", 'NVD']] new_poam['NVD'] = new_poam['NVD'].astype(str) new_poam['NVD'] = [x[10:] for x in new_poam['NVD']] new_poam['NVD'] = [x.replace("\/", ",") for x in new_poam['NVD']] new_poam['NVD'] = [x.split(",") for x in new_poam['NVD']] # 安全提取列表元素,长度不足时填充空值 new_poam['Attack Vector'] = new_poam['NVD'].apply(lambda x: x[0].strip() if len(x) >= 1 else pd.NA) new_poam['Attack Complexity'] = new_poam['NVD'].apply(lambda x: x[1].strip() if len(x) >= 2 else pd.NA) # 如需提取更多元素,依此类推 # new_poam['XXX'] = new_poam['NVD'].apply(lambda x: x[2].strip() if len(x)>=3 else pd.NA)
注:.strip()用于去除元素可能附带的空格,不需要可直接删除。
方法2:批量展开列表列(高效场景)
将NVD列的列表直接展开为多列,自动为长度不足的行填充NaN,再合并到原DataFrame:
import pandas as pd # 保留你的初始处理代码 poam = pd.read_excel('NetApp-RET-NVD_V1.xlsx', header = 0) new_poam = poam[["POAM ID ", 'NVD']] new_poam['NVD'] = new_poam['NVD'].astype(str) new_poam['NVD'] = [x[10:] for x in new_poam['NVD']] new_poam['NVD'] = [x.replace("\/", ",") for x in new_poam['NVD']] new_poam['NVD'] = [x.split(",") for x in new_poam['NVD']] # 展开列表为多列 expanded_cols = pd.DataFrame(new_poam['NVD'].tolist(), index=new_poam.index) # 按需求重命名列 expanded_cols.columns = ['Attack Vector', 'Attack Complexity', 'XXX', 'YYY'] # 去除元素空格 expanded_cols = expanded_cols.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 合并到原DataFrame new_poam = new_poam.join(expanded_cols)
这种方法适合需要提取多个列表元素的场景,无需逐列编写判断逻辑,处理效率更高。
内容的提问来源于stack exchange,提问作者Legion_of_boom__
相关产品推荐
相关产品推荐

