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

Pandas如何将指定列转为行 拆分价格、交易量为独立列

解答

你选择melt的方向没有问题,但直接将价格、交易量列全部传入value_vars,会把两类不同的度量值合并到同一列,无法满足拆分独立列的要求。针对这类「同一分类维度下对应多个度量字段」的宽表转长表场景,使用pandas.wide_to_long实现效率最高,无需多次转换拼接。

推荐实现方案(wide_to_long)

wide_to_long可以自动识别列名的结构,将同层级的不同度量值拆分到独立列,同时提取层级标识:

result = pd.wide_to_long(
    df,
    stubnames = ['price', 'vol'], # 拆分后保留的度量列名,对应列名的后缀部分
    i = ['uid', 'location'],      # 固定不拆分的行标识列
    j = 'unit_level',             # 存储层级标识的新列名
    sep = '_',                    # 列名中前缀、后缀的分隔符
    suffix = r'\w+'               # 匹配后缀的规则
).reset_index()

运行后unit_level列的取值自动为unit1/unit2/unit3,price列存储对应层级价格,vol列存储对应层级交易量,完全匹配预期结构。

基于melt的实现方案

如果要使用你最初尝试的melt方法,需要分别对价格、交易量列做两次融合,处理后再按主键合并:

# 融合价格列
melt_price = df.melt(
    id_vars=['uid', 'location'],
    value_vars=[col for col in df.columns if col.endswith('_price')],
    var_name='unit_level',
    value_name='price'
)
melt_price['unit_level'] = melt_price['unit_level'].str.replace('_price', '')

# 融合交易量列
melt_vol = df.melt(
    id_vars=['uid', 'location'],
    value_vars=[col for col in df.columns if col.endswith('_vol')],
    var_name='unit_level',
    value_name='vol'
)
melt_vol['unit_level'] = melt_vol['unit_level'].str.replace('_vol', '')

# 合并得到最终结果
result = melt_price.merge(melt_vol, on=['uid', 'location', 'unit_level'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:15:37