如何基于已有DataFrame列值高效生成目标DataFrame(大数据量场景)
高效重构DataFrame:替代双重循环的优化方案
我完全理解你面对2000万行数据时,双重循环慢到无法忍受的痛苦——这种Python层面的逐元素操作在大数据量下简直是灾难。咱们直接上更高效的方案,利用pandas的内置矢量化操作解决问题。
先回顾下你的核心需求:把col1作为索引,col2作为列,填充对应的col3值,同时只保留指定的col1和col2子集。
原始数据(方便参考)
import pandas as pd # 模拟你的原始DataFrame data = { 'col1': [1,1,1,2,2,3,4,4,4,4], 'col2': [10,11,12,10,24,10,10,11,89,91], 'col3': ['1.5','2.5','5,6','7.8','2.1','3.2','22.1','1.3','0.5','3.3'] } old_df = pd.DataFrame(data)
优化方案:用pivot + reindex替代循环
pandas的pivot函数是专门为这种「长表转宽表」场景设计的,底层用矢量化实现,效率比手动循环高几个数量级。步骤如下:
- 预处理(可选但重要):先处理
col3里的格式问题(比如你的示例里有5,6这种逗号分隔的数值,需要转成标准浮点数) - 生成宽表:用
pivot一次性完成行列转换 - 筛选目标子集:用
reindex精准提取你需要的行和列
代码实现:
# 第一步:清洗col3的数值格式(如果有非标准格式的话) old_df['col3'] = old_df['col3'].astype(str).str.replace(',', '.').astype(float) # 第二步:用pivot生成完整的宽表 pivoted_full = old_df.pivot(index='col1', columns='col2', values='col3') # 第三步:筛选你需要的col1和col2子集 selected_col1 = [1,2] selected_col2 = [10,11,24] selected_df = pivoted_full.reindex(index=selected_col1, columns=selected_col2) print(selected_df)
运行后得到的结果和你预期完全一致:
col2 10 11 24 col1 1 1.5 2.5 NaN 2 7.8 NaN 2.1
特殊情况处理:重复的(col1, col2)组合
如果你的原始数据中存在同一个col1+col2组合对应多个col3值的情况,pivot会报错。这时可以用pivot_table,指定聚合函数(比如取第一个值、平均值等):
# 用first来保留第一个出现的col3值 pivoted_full = old_df.pivot_table( index='col1', columns='col2', values='col3', aggfunc='first' # 也可以用'mean'/'max'等 )
为什么这个方案更快?
你的原方法是双重循环+每次query扫描全表,时间复杂度是O(k*n)(k是循环次数,n是总行数),2000万行的话会重复扫描几十甚至上百次。而pivot是一次性遍历全表完成转换,时间复杂度是O(n),再加上reindex的O(m)(m是目标子集的大小),整体效率提升非常明显,处理2000万行数据完全不在话下。
内容的提问来源于stack exchange,提问作者Satheesh K
相关产品推荐
相关产品推荐

