如何提升Pandas中遍历识别列表列并展开的效率
优化动态识别列表列的DataFrame展开效率问题
我有一段Python代码,通过多个API根据产品密钥获取数据,目前代码能正常运行,但想找更高效的实现方式。当前最耗时的部分是遍历DataFrame的列,判断列中是否包含列表,若包含就展开。现有代码来自Stack Overflow,原作者也不确定效率。我的DataFrame有45列,且后续调用API可能新增列,所以需要动态识别需展开的列,而非手动列出来传给pandas的explode函数。
原代码如下:
df_final = df.copy() for c in df.columns: if(isinstance(df[c][0],list)): df_final = df_final.explode(c) print(df_final.head(10))
原代码的问题
- 循环中每次修改
df_final都会生成新的DataFrame,多列场景下重复操作会大幅拖慢速度 - 只判断第一行是否为列表,若某列第一行不是列表但后续行是,就会被漏掉,判断不准确
优化方案
1. 准确识别所有含列表的列
用applymap遍历所有元素,判断是否为列表,再筛选出至少有一个列表元素的列:
list_cols = df.columns[df.applymap(lambda x: isinstance(x, list)).any()]
2. 一次性展开所有目标列
pandas的explode支持直接传入列名列表,一次完成所有展开操作,避免多次修改DataFrame:
df_final = df.explode(list_cols, ignore_index=True)
完整优化代码
# 动态识别所有包含列表的列 list_cols = df.columns[df.applymap(lambda x: isinstance(x, list)).any()] # 一次性展开所有目标列 df_final = df.explode(list_cols, ignore_index=True) print(df_final.head(10))
补充说明
如果你的DataFrame里有空列表或NaN,explode会默认保留这些行,要是需要过滤掉,可以加上:
df_final = df_final.dropna(subset=list_cols)
(根据实际需求调整即可)
内容的提问来源于stack exchange,提问作者odonnry
相关产品推荐
相关产品推荐

