Pandas宽表转长表:wide_to_long与melt的适用场景对比
wide_to_long vs melt的适用场景对比 wide_to_long更适合的场景:
列名有统一"前缀-后缀"结构的宽表转长表
比如列名是score_1,score_2,age_1,age_2这种,前缀是指标名称,后缀是分组标识(年份、编号、类别等)。用wide_to_long能一次性把同前缀的列合并成一个长列,同时自动把后缀提取为新的分组列,不用像melt那样先转长再拆分列名,步骤更简洁。
举个实际例子:原表有name,math_2020,math_2021,english_2020,english_2021列,用wide_to_long可以直接生成包含name,year,subject,score的长表;而用melt的话,得先把所有年份列转成值列,再拆分列名得到subject和year,还要做列名映射,操作更麻烦。需要保留多组标识列,同时批量处理同结构度量列
当你的宽表有多个需要保留的非度量列(比如用户ID、姓名、部门),且度量列都是按统一规则命名的,wide_to_long可以直接指定这些标识列作为id_vars,一次性完成所有度量列的转长操作,不用像melt那样多次处理或合并结果。处理多组重复的度量指标
比如一张表同时记录了不同年份的收入、支出、利润,列名是income_2020,income_2021,expense_2020,expense_2021,wide_to_long能一次性将这些转成长表,生成year(年份)和metric(收入/支出/利润)两个新列,而melt需要先转长所有列,再拆分列名,还要清洗拆分后的结果,效率和简洁性都不如前者。
补充:melt的适用场景
melt更适合列名没有统一结构的零散宽表,或者只需要将少数几列合并成值列的场景——比如把几列独立的指标(如身高, 体重, 年龄)转成指标名称和指标值的长表,这种场景下melt反而更直接。
内容的提问来源于stack exchange,提问作者Archie

