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

如何高效将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]

大数据量适配说明

  1. 性能保障:上述两种方法都是Pandas内置的矢量化操作,底层用C语言优化,处理速度比自定义循环快几个数量级,完全能应对5000万+行的数据。
  2. 重复组合处理:如果你的数据中存在重复的(Value, Class)组合,需要先聚合counts(比如求和),改用pivot_table即可:
    result = df.pivot_table(
        index='Value', 
        columns='Class', 
        values='counts', 
        aggfunc='sum',  # 根据需求选择聚合函数:sum/mean等
        fill_value=0
    ).reset_index()
    
  3. 内存注意事项:若Class的唯一值数量极大(比如上万级),宽表会占用大量内存。这种情况下可以考虑:
    • 用pd.arrays.SparseArray存储稀疏数据,减少内存占用
    • 分块处理数据,再合并结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:11:16