如何将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
相关产品推荐
相关产品推荐

