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

在Jupyter Notebook中合并Excel导入的同名列并转换为长格式

解决方案

要批量处理带.1/.2后缀的列名,同时自动合并变量名,无需手动罗列所有变量,可以通过字符串清洗+长格式转换两步实现,以下是具体实现方式:

方法一:melt + 字符串提取(兼容所有pandas版本)

步骤说明:

  1. 用melt将宽表转成长表,自动包含所有非标识列(比如问卷编号类的唯一标识列)
  2. 对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:30