如何在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
相关产品推荐
相关产品推荐

