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

如何为Python pd.melt()函数的结果添加column_number列

在pd.melt()结果中自动添加column_number列

问题场景

输入DataFrame:

name age gender  id
a   18  m       1   
b   20  f       2 

使用pd.melt()后当前输出:

id   variable   value
    1    name        a
    1    age         18
    1    gender      m
    2    name        b
    2    age         20
    2    gender      f

期望输出(新增column_number列,按原始列顺序生成序号):

id  column_number  variable   value
1    1             name        a
1    2             age         18
1    3             gender      m
2    1             name        b
2    2             age         20
2    3             gender      f

需求:DataFrame结构可能变化,无法预知列数,需自动生成对应序号列。

解决方案

核心思路是先获取需要逆透视的列的原始顺序,建立列名到序号的映射,再在melt后的结果中通过映射生成column_number列。

代码实现

import pandas as pd

# 示例输入DataFrame(实际使用时替换为你的数据)
df = pd.DataFrame({
    'name': ['a', 'b'],
    'age': [18, 20],
    'gender': ['m', 'f'],
    'id': [1, 2]
})

# 1. 筛选出需要逆透视的列(排除标识符列,这里是'id')
variable_cols = [col for col in df.columns if col != 'id']

# 2. 建立列名到序号的映射,序号从1开始
col_number_mapping = {col: idx + 1 for idx, col in enumerate(variable_cols)}

# 3. 执行逆透视操作
melted_result = pd.melt(
    df,
    id_vars=['id'],  # 保留的标识符列
    value_vars=variable_cols,  # 需要逆透视的列
    var_name='variable',
    value_name='value'
)

# 4. 添加column_number列
melted_result['column_number'] = melted_result['variable'].map(col_number_mapping)

# 5. 调整列顺序匹配期望输出
melted_result = melted_result[['id', 'column_number', 'variable', 'value']]

print(melted_result)

适配说明

  • 如果有多个标识符列,只需修改id_vars参数(比如id_vars=['id', 'other_id']),同时调整variable_cols的筛选逻辑(排除所有标识符列)。
  • 序号会严格按照原始DataFrame中列的顺序生成,无论后续列如何增减,都能自动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:36:06