使用Pandas Apply调用返回列表的函数时遇IndexError,求将列表元素转为DataFrame多列的解决方案
Pandas Apply调用返回列表的函数时遇IndexError,求将列表元素转为DataFrame多列的解决方案
嘿,我来帮你捋捋这个问题哈~
你碰到的IndexError: list index out of range,核心原因是你的parse_config函数默认所有输入字符串都符合abc.(e).ghi这种至少包含两个.的格式,但你的DataFrame里肯定存在一些不符合规则的行(比如字符串里没点、只有一个点),导致pos列表长度不够2,访问pos[-2]时自然就触发索引越界了。
给你两个实用的解决方案,一个是修复自定义函数的鲁棒性,另一个是更高效的正则提取方式:
方案一:修复自定义函数+规范转列操作
首先优化你的parse_config函数,增加格式判断,避免因输入异常报错:
import re def parse_config(string): str_val = str(string) # 提取所有`.`的位置 pos = [match.start() for match in re.finditer(r'\.', str_val)] # 如果不符合预期格式,返回固定长度的空值列表,保证后续转列不会出错 if len(pos) < 2: return ['', '', '', ''] # 原有的解析逻辑 out = [] out.append(str_val[0:pos[-2]]) out.append(str_val[pos[-2]+2:pos[-1]-1]) out.append(str_val[pos[-1]+1:][:-1]) out.append(str_val[pos[-1]+1:][-1]) return out
然后用更稳妥的方式把解析结果转为多列:
# 对configuration列应用函数,将返回的列表转为DataFrame new_columns = df['configuration'].apply(parse_config).apply(pd.Series) # 给新列命名 new_columns.columns = ['a', 'b', 'c', 'd'] # 把新列合并到原DataFrame df = pd.concat([df, new_columns], axis=1)
方案二:用正则直接提取(更高效,优先推荐)
其实这种固定格式的字符串解析,用Pandas的str.extract正则提取会更高效,还不用写自定义函数:
# 正则匹配目标格式,直接提取4个分组 df[['a', 'b', 'c', 'd']] = df['configuration'].str.extract(r'^(.*)\.\((.*)\)\.(.*)(.)$', expand=True)
这个正则的逻辑是:
^(.*):匹配开头到第一个.(之前的内容(对应示例里的abc)\.\((.*)\)\.:匹配.(和).之间的内容(对应示例里的e)(.*):匹配最后一个.到倒数第一个字符的内容(对应示例里的gh)(.)$:匹配最后一个字符(对应示例里的i)
如果遇到不符合格式的行,对应的列会自动填充为NaN,你可以后续再统一处理这些异常值。
备注:内容来源于stack exchange,提问作者JWood
相关产品推荐
相关产品推荐

