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

如何高效提取DataFrame中相同ID行并重构数据集?

高效处理百万级DataFrame的长转宽操作

针对你150万行的长格式数据集(id-attribute-value结构),要转成id为行、attribute为列的宽表,以下是两种时间复杂度极低的高效方案,完全替代低效的merge或查重操作:

原数据结构

idattributevalue
1attribute 1value 1
1attribute 2value 2
1attribute 3value 3
2attribute 1value 1
2attribute 2value 2

目标结构

idattribute 1attribute 2attribute 3
1value 1value 2value 3
2value 1value 2NaN

方案1:用pandas.pivot直接转换(最快最简洁)

pivot是pandas专为长转宽场景设计的函数,底层是C级向量化操作,时间复杂度接近O(n),处理百万级数据毫无压力:

import pandas as pd

# 假设原数据存储在df变量中
wide_df = df.pivot(index='id', columns='attribute', values='value').reset_index()
# 移除列索引的名称(可选,让结果更贴合你的目标格式)
wide_df.columns.name = None

该操作会自动将相同id的行合并,缺失的attribute对应位置自动填充NaN(对应需求中的NA)。

方案2:groupby + unstack(适配多值场景)

如果你的数据存在同一个id+attribute对应多个value的情况,用groupby指定聚合规则后再转宽,效率同样很高:

# 这里用first取第一个值,可根据需求替换为mean/sum等聚合函数
wide_df = df.groupby(['id', 'attribute'])['value'].first().unstack().reset_index()
wide_df.columns.name = None

为什么这些方案比merge/查重高效?

  • 普通merge或循环查重属于O(n²)级别的操作,数据量越大越慢;而pivot/groupby+unstack是pandas优化的向量化操作,仅需遍历数据一次,时间复杂度远低于前者。
  • 转宽的过程已经自动完成了相同id的聚合,无需单独执行查重步骤。

异常处理

如果运行pivot时报错(通常是因为存在重复的id+attribute组合),改用pivot_table指定聚合函数即可:

wide_df = df.pivot_table(index='id', columns='attribute', values='value', aggfunc='first').reset_index()
wide_df.columns.name = None

内容的提问来源于stack exchange,提问作者luism

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:02