寻求高效存储500万行Pandas DataFrame至列表的方法及向量化方案
高效将百万级DataFrame每行转为列表的方法
你的原方法用iterrows()逐行迭代效率很低——因为iterrows()每次都会返回(index, Series)元组,创建Series的额外开销在百万级数据下会被大幅放大,导致整体速度拖沓。下面是几种更高效的方案,包括向量化实现:
1. 向量化方案(最优推荐)
直接利用pandas底层数组操作,完全规避逐行迭代,这是处理大DataFrame的最快方式:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'id': [0, 1, 2, 3], 'val': ['w','x','y','z'], 'pos': ['p1','p2','p3','p4'] }) # 向量化转换:转numpy数组后直接生成列表 df_lst = df.to_numpy().tolist() # 等价写法:df.values.tolist()(to_numpy是pandas官方推荐的新API)
这个方法直接操作DataFrame的底层numpy数组,没有逐行迭代的额外开销,500万行数据的转换速度是iterrows()的几十倍甚至上百倍。转换后df_lst的每个元素就是对应行的数值列表,完全匹配需求。
2. 使用itertuples()(比iterrows快数倍)
如果需要灵活控制迭代逻辑(比如保留行索引),可以用itertuples(),它返回元组而非Series,开销远低于iterrows():
# 不带行索引,返回普通元组列表 df_lst = list(df.itertuples(index=False, name=None)) # 若需保留行索引,去掉index=False参数 # df_lst = list(df.itertuples(name=None)) # 如需将元组转为列表,可加一层轻量转换 # df_lst = [list(row) for row in df.itertuples(index=False, name=None)]
itertuples()的速度大概是iterrows()的5-10倍,适合不需要完全向量化但想显著提升效率的场景。
性能对比(针对500万行数据)
df.to_numpy().tolist():最快,几乎瞬时完成df.itertuples():次之,比原方法快一个数量级- 原
iterrows()方案:最慢,耗时是前两者的几十倍
内容的提问来源于stack exchange,提问作者kgh
相关产品推荐
相关产品推荐

