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

如何在Python Pandas中展开存储为单值的可迭代对象(反向groupby)

最优实现方案

Pandas 0.25及以上版本内置了explode方法,专门用来展开列表类型的列为多行,是底层优化的矢量化操作,处理几十万行数据的速度远快于手动循环:

import pandas as pd

df = pd.DataFrame({
    'Letter': ['A', 'B', 'C'],
    'Numbers': [[1, 11], [2, 22], [3, 33]]
})

# 直接展开Numbers列的列表为多行,自动复制其他列的对应值
df = df.explode('Numbers', ignore_index=True)
# 如果需要从1开始的连续Index可以加这一行
df.index = df.index + 1

运行后即可得到你预期的结果。

原代码性能差的原因

  • iterrows遍历DataFrame本身性能极低,每一行都要生成Series对象,数据量大时开销极高
  • 循环内反复调用append方法,Pandas的append是惰性操作,每次都会生成全新的DataFrame对象,内存开销和时间开销随数据量增长指数级上升
  • 最后还要全表扫描过滤原有的列表行,额外增加了无用开销

旧版本Pandas兼容方案(0.25以下版本)

如果你的Pandas版本过低不支持explode,可以用apply+stack的方式实现,性能也远高于手动循环:

df = df.set_index(['Letter'])['Numbers'].apply(pd.Series).stack().reset_index(level=0, name='Numbers').reset_index(drop=True)
df.index = df.index + 1

你之前用apply得到空DataFrame大概率是因为拼接逻辑错误,没有正确把拆分后的Series还原为DataFrame结构。

内容的提问来源于stack exchange,提问作者csant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:36:02