Python数据池化优化:求更快、低内存的高效实现方案
高效实现按指定次数重复数据行的方案
针对你处理3.5GB数据集时遇到的耗时久、内存占用高的问题,原代码的核心问题是两次重复调用groupby.apply做逐组循环处理,这种方式在大数据集上效率极低。以下是两种更高效的实现方案:
方案1:利用Pandas索引重复(最快最省内存)
直接通过索引重复实现行复制,完全避免分组循环:
# 按Amount列的值重复对应行,保留所有列 result = df.loc[df.index.repeat(df['Amount'])] # 如果不需要保留Amount列,直接删除 result = result.drop('Amount', axis=1)
这个方法依赖Pandas底层的向量优化操作,比原代码快一个数量级以上,内存占用仅为原方法的几分之一——因为不需要生成中间的pd.Series对象。
方案2:使用explode(Pandas 0.25+版本支持)
如果你的Pandas版本足够新,可以先构造重复的列表再展开:
# 给每行生成对应长度的空列表,再展开 df['temp'] = df['Amount'].apply(lambda x: [None]*x) result = df.explode('temp').drop(['Amount', 'temp'], axis=1)
这个方法效率略低于方案1,但代码可读性较好,适合对代码简洁性有要求的场景。
极端内存不足时的分块处理
如果数据集大到单内存无法容纳,可以按分块读取处理:
chunk_size = 100000 # 根据自身内存情况调整块大小 result_list = [] for chunk in pd.read_csv('your_data.csv', chunksize=chunk_size): processed_chunk = chunk.loc[chunk.index.repeat(chunk['Amount'])].drop('Amount', axis=1) result_list.append(processed_chunk) # 合并所有分块结果 final_result = pd.concat(result_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者dawn
相关产品推荐
相关产品推荐

