You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于已有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函数是专门为这种「长表转宽表」场景设计的,底层用矢量化实现,效率比手动循环高几个数量级。步骤如下:

  1. 预处理(可选但重要):先处理col3里的格式问题(比如你的示例里有5,6这种逗号分隔的数值,需要转成标准浮点数)
  2. 生成宽表:用pivot一次性完成行列转换
  3. 筛选目标子集:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:00:18