按固定行数拆分大Pandas DataFrame的现有实现是否正确?
现有实现存在的问题
- 拆分行数不符合预期:如果你的DataFrame是默认从0开始的连续整数索引,第一个拆分出来的小df会包含3001行(对应原df索引0到3000),不符合你预设的每个小df 3000行的要求。
- 强依赖索引格式:逻辑完全绑定索引为连续整数且从0开始的场景,只要你的df做过过滤、索引被修改为非连续整数/字符串/时间类型,
index % 3000的判断逻辑就会完全失效,要么提前拆分、要么永远达不到拆分条件,结果完全不符合预期。 - 性能极低:
iterrows()遍历是pandas里性能最差的操作之一,处理百万行级别的大df时,遍历的时间开销是向量化操作的几十上百倍,完全没有用到pandas的性能优势。 - 数据类型可能漂移:逐行append Series再转DataFrame的过程,可能会出现列数据类型被自动转换的问题,比如某列原本是int类型,因为中间存在空值被强制转为float,和原df的数据类型不一致。
- 拆分后索引不连续:得到的小df索引是原大df的索引片段,不是连续值,后续处理小df时可能会有额外的索引处理开销。
更优的实现方案
直接用pandas原生切片就能完成需求,不需要遍历:
import pandas as pd def partition_df(df, chunk_size=3000): partitioned_df = [] # 按指定行数步长切分 for i in range(0, len(df), chunk_size): # reset_index(drop=True)是重置每个小df的索引为从0开始的连续值,不需要可以删掉 partitioned_df.append(df.iloc[i:i+chunk_size].reset_index(drop=True)) return partitioned_df
这个方案不依赖索引格式、性能远高于遍历实现、完全保留原df的数据类型,也不会出现行数不符的问题。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

