如何基于正则模式将DataFrame列透视为指定格式的多列?
问题解决方法
你的DataFrame有33列,列名格式为Description_1_1、Description_2_1这类,需要生成11个目标列(Description_1至Description_8、Description_91至Description_93),核心思路是按原列名最后一个下划线后的数字分组,再将同组列转回宽表,具体步骤如下:
方法一:用melt+分组+pivot实现(直观易理解)
- 筛选目标列并转长表,保留分组标识
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']
- 转回宽表得到目标列
如果同一分组下有多个值(比如每个目标列对应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
相关产品推荐
相关产品推荐

