在Jupyter Notebook中合并Excel导入的同名列并转换为长格式
解决方案
要批量处理带.1/.2后缀的列名,同时自动合并变量名,无需手动罗列所有变量,可以通过字符串清洗+长格式转换两步实现,以下是具体实现方式:
方法一:melt + 字符串提取(兼容所有pandas版本)
步骤说明:
- 用
melt将宽表转成长表,自动包含所有非标识列(比如问卷编号类的唯一标识列) - 对
variable列做字符串处理,提取前缀去掉数字后缀
代码示例:
import pandas as pd # 模拟导入后的DataFrame结构 df = pd.DataFrame({ 'respondent_id': [1, 2, 3], 'q1.1': [10, 20, 30], 'q1.2': [15, 25, 35], 'q2.1': [5, 6, 7], 'q2.2': [8, 9, 10], # 更多40+类似列... }) # 1. 转长格式,自动处理所有非respondent_id的列 melted_df = df.melt( id_vars='respondent_id', # 替换成你的唯一标识列,无标识列可改用id_vars=df.index var_name='original_var', value_name='answer' ) # 2. 清洗变量名:提取前缀,去掉.1/.2这类数字后缀 # 正则匹配提取前缀,兼容任意数字后缀;无后缀的列保持原样 melted_df['clean_var'] = melted_df['original_var'].str.extract(r'^(.+?)\.\d+$', expand=False) # 补充:若存在无后缀的列,用fillna保留原变量名 melted_df['clean_var'] = melted_df['clean_var'].fillna(melted_df['original_var']) # 可选:去掉原变量名列,只保留清洗后的列 final_df = melted_df.drop('original_var', axis=1)
方法二:用pivot_longer(pandas 1.1.0+推荐)
pivot_longer支持通过正则批量匹配列名,直接完成分组和转换,代码更简洁:
# 直接对原宽表操作,正则匹配列名前缀 final_df = pd.pivot_longer( df, cols=df.columns.drop('respondent_id'), # 自动排除标识列 names_to='clean_var', names_pattern=r'^(.+?)\.\d+$', # 匹配带数字后缀的列,提取前缀 values_to='answer' ) # 补充:如果有不带后缀的列,用names_transform做兼容处理 final_df = pd.pivot_longer( df, cols=df.columns.drop('respondent_id'), names_to='clean_var', names_transform=lambda x: x.split('.')[0] if '.' in x and x.split('.')[1].isdigit() else x, values_to='answer' )
关键优势:
- 无需手动枚举40+变量名,所有带数字后缀的列会自动被分组
- 兼容无后缀的列,不会破坏原有数据结构
- 代码可复用,后续新增同名列也能自动处理
内容的提问来源于stack exchange,提问作者bubbaJackson
相关产品推荐
相关产品推荐

