如何高效提取DataFrame中相同ID行并重构数据集?
高效处理百万级DataFrame的长转宽操作
针对你150万行的长格式数据集(id-attribute-value结构),要转成id为行、attribute为列的宽表,以下是两种时间复杂度极低的高效方案,完全替代低效的merge或查重操作:
原数据结构
| id | attribute | value |
|---|---|---|
| 1 | attribute 1 | value 1 |
| 1 | attribute 2 | value 2 |
| 1 | attribute 3 | value 3 |
| 2 | attribute 1 | value 1 |
| 2 | attribute 2 | value 2 |
目标结构
| id | attribute 1 | attribute 2 | attribute 3 |
|---|---|---|---|
| 1 | value 1 | value 2 | value 3 |
| 2 | value 1 | value 2 | NaN |
方案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
相关产品推荐
相关产品推荐

