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

如何基于正则模式将DataFrame列透视为指定格式的多列?

问题解决方法

你的DataFrame有33列,列名格式为Description_1_1、Description_2_1这类,需要生成11个目标列(Description_1至Description_8、Description_91至Description_93),核心思路是按原列名最后一个下划线后的数字分组,再将同组列转回宽表,具体步骤如下:

方法一:用melt+分组+pivot实现(直观易理解)

  1. 筛选目标列并转长表,保留分组标识
import pandas as pd

# 筛选所有以Description开头的列
desc_cols = [col for col in df.columns if col.startswith('Description')]
# 转长表,uuid作为唯一标识
long_df = df.melt(id_vars=['uuid'], value_vars=desc_cols, var_name='original_col', value_name='value')
# 提取原列名最后一段数字作为分组键,生成目标列名
long_df['group_key'] = long_df['original_col'].str.split('_').str[-1]
long_df['target_col'] = 'Description_' + long_df['group_key']
  1. 转回宽表得到目标列
    如果同一分组下有多个值(比如每个目标列对应3个原列),可以用聚合函数合并(比如字符串拼接):
# 聚合合并同一组的多个值,转回宽表
result_df = long_df.pivot_table(
    index='uuid',
    columns='target_col',
    values='value',
    aggfunc=lambda x: ', '.join(x.astype(str))  # 可根据需求替换为sum、first等
).reset_index()

# 重命名列名,去掉target_col层级
result_df.columns.name = None

方法二:用wide_to_long简化步骤

如果你坚持用wide_to_long,可以调整参数后再处理分组:

# 拆分原列名,j捕获下划线后的所有内容
temp_df = pd.wide_to_long(
    df,
    stubnames=['Description'],
    i=['uuid'],
    j='full_suffix',
    suffix=r'.+'  # 匹配下划线后的任意字符
).reset_index()

# 提取full_suffix的最后一段数字作为分组键
temp_df['group_key'] = temp_df['full_suffix'].astype(str).str.split('_').str[-1]
temp_df['target_col'] = 'Description_' + temp_df['group_key']

# 转回宽表
result_df = temp_df.pivot_table(
    index='uuid',
    columns='target_col',
    values='Description',
    aggfunc=lambda x: ', '.join(x.astype(str))
).reset_index()
result_df.columns.name = None

执行后,原列Description_1_1、Description_2_1、Description_3_1会被合并到Description_1列,Description_1_2等对应Description_2列,以此类推,最终生成你需要的11个目标列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:43:18