You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:53:25