如何用Pandas将DataFrame多列同时融合为两行?
Pandas DataFrame多列结构化转换
原始DataFrame结构
ID ID2 ID3 R_u L_u R_sd L_sd 1 F G1 x y z t 2 M G2 x y z t
目标转换后结构
ID ID2 ID3 Side u sd 1 F G1 R x z 1 F G1 L y t 2 M G2 R x z 2 M G2 L y t
用户尝试使用pandas.melt处理,但仅能单独处理R_u/L_u这类列,无法同时批量处理多组(如u和sd两组)列,希望实现自动化转换。
最优解决方案:使用pd.wide_to_long
这种场景下,pd.wide_to_long比melt更适配,它能自动识别列名中的前缀(R/L)和后缀(u/sd),一次性完成宽表转长表的结构化转换:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'ID': [1, 2], 'ID2': ['F', 'M'], 'ID3': ['G1', 'G2'], 'R_u': ['x', 'x'], 'L_u': ['y', 'y'], 'R_sd': ['z', 'z'], 'L_sd': ['t', 't'] }) # 执行转换 df_result = pd.wide_to_long( df, stubnames=['u', 'sd'], # 指定需要转换的指标列后缀 i=['ID', 'ID2', 'ID3'], # 保留的标识列 j='Side', # 新生成的前缀对应列名 sep='_', # 列名中前缀与后缀的分隔符 suffix='.' # 匹配后缀的正则规则,.表示匹配任意字符 ).reset_index() print(df_result)
执行后输出:
ID ID2 ID3 Side u sd 0 1 F G1 R x z 1 1 F G1 L y t 2 2 M G2 R x z 3 2 M G2 L y t
如果后续新增类似R_xx/L_xx的列,只需扩展stubnames参数即可,完全实现自动化处理。
备选方案:多次melt后合并
如果坚持使用melt,可以分两次处理不同指标列,再通过标识列合并:
# 处理u列并提取Side melt_u = df.melt( id_vars=['ID', 'ID2', 'ID3'], value_vars=['R_u', 'L_u'], var_name='Side', value_name='u' ).assign(Side=lambda x: x['Side'].str.split('_').str[0]) # 处理sd列并提取Side melt_sd = df.melt( id_vars=['ID', 'ID2', 'ID3'], value_vars=['R_sd', 'L_sd'], var_name='Side', value_name='sd' ).assign(Side=lambda x: x['Side'].str.split('_').str[0]) # 合并两个结果 df_result = melt_u.merge(melt_sd, on=['ID', 'ID2', 'ID3', 'Side']) print(df_result)
该方案同样能得到目标结果,但当列数增多时,需要重复编写melt逻辑,效率不如pd.wide_to_long。
内容的提问来源于stack exchange,提问作者SAM
相关产品推荐
相关产品推荐

