如何高效将Pandas DataFrame重复行转换为宽表结构?
高效实现Pandas长表转宽表(大数据量适配)
针对你这种大数据量(1000万+唯一Value、5000万+数据行)的场景,直接用Pandas内置的矢量化重塑操作是最优解,完全不需要暴力循环,以下是具体实现方案:
核心实现代码
首先构造示例数据:
import pandas as pd df = pd.DataFrame({ 'Value': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3}, 'Class': {0: 14, 1: 7, 2: 15, 3: 1, 4: 12, 5: 2, 6: 15}, 'counts': {0: 2065, 1: 1268, 2: 78, 3: 54, 4: 40, 5: 33, 6: 6} })
方法一:set_index + unstack(推荐,性能更优)
这是Pandas中处理数据重塑的底层高效操作,基于Cython实现,避免Python层面循环:
# 设置双索引,将Class展开为列,缺失值直接填充0 result = df.set_index(['Value', 'Class'])['counts'].unstack(fill_value=0).reset_index() # 可选:按Class值升序排列列(匹配你的目标格式) sorted_class_cols = sorted(result.columns[1:]) result = result[['Value'] + sorted_class_cols]
执行后得到的结果完全符合你的需求:
Value 1 2 7 12 14 15 0 1 0 0 1268 0 2065 78 1 2 54 33 0 40 0 0 2 3 0 0 0 0 0 6
方法二:pivot方法(逻辑更直观)
如果更看重代码可读性,也可以用pivot,效果一致:
# 按Value行、Class列重塑,填充缺失值为0并转为整数 result = df.pivot(index='Value', columns='Class', values='counts').fillna(0).astype(int).reset_index() # 同样可选排序列 sorted_class_cols = sorted(result.columns[1:]) result = result[['Value'] + sorted_class_cols]
大数据量适配说明
- 性能保障:上述两种方法都是Pandas内置的矢量化操作,底层用C语言优化,处理速度比自定义循环快几个数量级,完全能应对5000万+行的数据。
- 重复组合处理:如果你的数据中存在重复的
(Value, Class)组合,需要先聚合counts(比如求和),改用pivot_table即可:result = df.pivot_table( index='Value', columns='Class', values='counts', aggfunc='sum', # 根据需求选择聚合函数:sum/mean等 fill_value=0 ).reset_index() - 内存注意事项:若Class的唯一值数量极大(比如上万级),宽表会占用大量内存。这种情况下可以考虑:
- 用
pd.arrays.SparseArray存储稀疏数据,减少内存占用 - 分块处理数据,再合并结果
- 用
内容的提问来源于stack exchange,提问作者Vance
相关产品推荐
相关产品推荐

