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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:57:54