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

