如何用Pandas将DataFrame的B/C系列对应列融合为B、C两列?
Pandas DataFrame多列配对重塑解决方案
针对你的需求,这里提供两种高效的解决方法:
方法一:分别处理B/C列后合并
先单独将B类、C类列转为长格式,提取列名中的序号作为匹配键,最后合并两表得到结果:
import pandas as pd # 示例原始数据 data = { 'ID_col': ['ID_1', 'ID_2'], 'B1': ['B1_value', 'B2_value'], 'B2': ['B1_value2', 'B2_value2'], 'B3': ['B1_value3', 'B2_value3'], 'C1': ['C1_value', 'C2_value'], 'C2': ['C1_value2', 'C2_value2'], 'C3': ['C1_value3', 'C2_value3'] } df = pd.DataFrame(data) # 处理B列,提取序号用于匹配 b_melted = df.melt(id_vars=['ID_col'], value_vars=['B1','B2','B3'], value_name='B') b_melted['seq'] = b_melted['variable'].str.extract('(\d+)') # 处理C列,同样提取序号 c_melted = df.melt(id_vars=['ID_col'], value_vars=['C1','C2','C3'], value_name='C') c_melted['seq'] = c_melted['variable'].str.extract('(\d+)') # 按ID和序号合并,保留需要的列 final_df = pd.merge(b_melted, c_melted, on=['ID_col','seq'])[['ID_col','B','C']]
方法二:使用wide_to_long直接转换
Pandas的wide_to_long专门处理这种"前缀+序号"的宽表转长表场景,代码更简洁:
# 直接转换,stubnames指定前缀B和C,j提取序号 df_long = pd.wide_to_long(df, stubnames=['B','C'], i='ID_col', j='seq', sep='', suffix='\d+') # 重置索引得到目标结构 final_df = df_long.reset_index()[['ID_col','B','C']]
参数说明:
stubnames:指定宽表中需要转换的列前缀(这里是B和C)i:作为标识符的列(这里是ID_col)j:提取的序号列名sep:列名中前缀和序号的分隔符(这里为空,因为列名是B1、C1这种无分隔符的形式)suffix:匹配序号的正则表达式,\d+表示匹配一个或多个数字
内容的提问来源于stack exchange,提问作者stasia_l
相关产品推荐
相关产品推荐

