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

如何将DataFrame多列合并为单列?百万级数据内存错误解决求助

解决百万行DataFrame列合并的内存问题

嘿,这个场景我太熟悉了!用循环append处理百万级别的数据,简直是内存杀手——每次append都会创建新的DataFrame,反复复制数据直接把内存撑爆。咱们换个思路,用pandas专门为这种宽表转长表场景设计的高效函数,分分钟解决问题,还省内存。

先明确你的需求:把除ID外的所有列,都转成和对应ID绑定的单列数据,也就是宽表转长表(wide-to-long format),pandas的melt()方法就是干这个的,完全不需要写循环。

先看你的原始数据示例:

import pandas as pd

original_df = pd.DataFrame({
    'ID': [1001, 1002, 1003, 1004],
    'Column 2': ['B', 'C', 'E', 'G'],
    'Column 3': ['A', 'D', 'E', 'H']
    # 你的实际数据还有Column4到Column20,这里省略
})

用melt()实现你要的结果:

# 核心代码,一行搞定宽转长
result_df = original_df.melt(
    id_vars='ID',          # 指定保留的标识列:ID
    value_name='Merged'   # 合并后的列名,对应你要的"Merged"
)

# 如果你不需要原列名的记录(也就是自动生成的"variable"列),直接删掉就行
result_df = result_df.drop(columns='variable')

# 重置索引,和你期望的结果索引格式一致
result_df = result_df.reset_index(drop=True)

输出结果完全符合你的需求:

ID Merged
0  1001      B
1  1002      C
2  1003      E
3  1004      G
4  1001      A
5  1002      D
6  1003      E
7  1004      H

为什么这个方法比循环好?

  • 内存效率高:melt()是在原数据结构上做重塑,不会像循环append那样反复复制整个DataFrame,处理100万行20列的数据毫无压力。
  • 速度快:内置函数是C级别的实现,比Python循环快几个数量级。
  • 代码简洁:一行核心代码搞定,不需要写繁琐的循环逻辑。

如果你的列需要筛选(比如只合并特定前缀的列),可以用value_vars参数指定,比如:

# 只合并以"Column"开头的列
target_cols = [col for col in original_df.columns if col.startswith('Column')]
result_df = original_df.melt(
    id_vars='ID',
    value_vars=target_cols,
    value_name='Merged'
).drop(columns='variable').reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:51