如何用Pandas向量化方法基于现有列生成新列并重塑DataFrame
实现向量化的DataFrame重塑解决方案
针对你需要将长格式DataFrame转换为指定宽格式的需求,完全可以用pandas的内置向量化方法实现,不需要手动遍历行。下面分步骤说明具体实现:
首先,先明确原DataFrame的正确结构(修正你输入时的排版问题):假设你的原始数据是每行对应一个e的取值,包含e的键(0/10/11/15)、e对应的数值(40/35/30/65)、val对应的数值(125/150/110/115),构造代码如下:
import pandas as pd df = pd.DataFrame({ 'e': [0, 10, 11, 15], 'e_val': [40, 35, 30, 65], 'val': [125, 150, 110, 115] })
方法一:Melt + Pivot(直观易懂)
这种方法先把数据转成长格式,再重新塑造成宽格式,适合新手理解:
# 1. 将e_val和val列熔化为长格式,保留e作为分组键 melted = df.melt(id_vars=['e'], var_name='prefix', value_name='value') # 2. 生成目标列名:前缀(val/e_val)+ 下划线 + e的取值 melted['col_name'] = melted['prefix'] + '_' + melted['e'].astype(str) # 3. 转成宽格式,重置索引得到单行结果 result = melted.pivot(columns='col_name', values='value').reset_index(drop=True) # 4. 调整列名(把e_val改成e)和顺序,匹配你的需求 result.columns = result.columns.str.replace('e_val', 'e') desired_order = ['val_0', 'val_10', 'val_11', 'val_15', 'e_0', 'e_10', 'e_11', 'e_15'] result = result[desired_order]
方法二:Set_index + Unstack(更简洁高效)
如果不需要保留中间步骤,这种方法更紧凑,直接利用索引操作完成重塑:
# 1. 以e为索引,将列和索引层级展开 result = df.set_index('e').unstack().to_frame().T # 2. 组合层级列名为目标格式 result.columns = [f'{col[0]}_{col[1]}' for col in result.columns] # 3. 调整列名和顺序 result.columns = result.columns.str.replace('e_val', 'e') desired_order = ['val_0', 'val_10', 'val_11', 'val_15', 'e_0', 'e_10', 'e_11', 'e_15'] result = result[desired_order]
最终输出
两种方法都会得到你需要的结果:
val_0 val_10 val_11 val_15 e_0 e_10 e_11 e_15 0 125 150 110 115 40 35 30 65
核心优势
这两种方法都是完全向量化的,依赖pandas内部的C级优化实现,比手动遍历行的效率高得多,尤其是在数据量较大时表现更明显。核心逻辑是通过pandas的重塑函数,将分散的行数据映射到目标列中,避免了循环带来的性能损耗。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

