Python中如何melt DataFrame中type列后的整数、字符串类型指定列?
你的思路是对的,直接用pandas的melt方法即可实现需求,不需要手动枚举type之后的列,自动定位列位置即可适配列数多、列名类型不统一的场景,具体代码如下:
核心实现代码
# 定位type列的索引位置 type_col_idx = df.columns.get_loc('type') # 拆分出固定保留的id列和要转换的数值列 id_columns = df.columns[:type_col_idx + 1] value_columns = df.columns[type_col_idx + 1:] # 执行宽表转长表 result_df = df.melt( id_vars=id_columns, value_vars=value_columns, var_name='category', value_name='values' ) # 如果需要保持和你示例一致的按no升序的输出顺序,可补充排序逻辑 result_df = result_df.sort_values(by='no', ignore_index=True)
完整测试代码(包含示例数据构造)
import pandas as pd # 构造你的示例DataFrame df = pd.DataFrame( data=[ [1, 'bar', 'any', 2, 3, 1, 3], [2, 'foo', 'all', 3, 4, 0, 1] ], columns=['no', 'id', 'type', 'xa', 'xa', '01', '02'] ) type_col_idx = df.columns.get_loc('type') id_columns = df.columns[:type_col_idx + 1] value_columns = df.columns[type_col_idx + 1:] result_df = df.melt( id_vars=id_columns, value_vars=value_columns, var_name='category', value_name='values' ).sort_values(by='no', ignore_index=True) print(result_df)
注:你给出的预期输出示例存在手误,实际转换后
category列会匹配原表type之后的列名:xa、xa、01、02,和原列名完全对应。
内容的提问来源于stack exchange,提问作者nomnom3214
相关产品推荐
相关产品推荐

