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

Pandas中将聚合值按类别逆转为唯一行的实现方案

数据拆分与透视分组解决方案

问题描述

我有一个数据集,需要将聚合值拆分为独立的唯一行,同时按类别执行透视与分组操作。以下是原始数据、期望输出结果,以及我当前尝试的代码,恳请各位提供改进建议。

原始数据

Date         start      end         area    BB_stat AA_stat BB_test AA_test final   
10/1/2022   11/1/2022   12/1/2022   NY      10      80      0       1       1/1/2022    
11/1/2022   12/1/2022   01/1/2023   NY      5       90      1       0       1/1/2022    
10/1/2022   11/1/2022   12/1/2022   CA      6       100     3       1       1/1/2022    
11/1/2022   12/1/2022   01/1/2023   CA      7       0       2       8       1/1/2022    

期望输出

Date        start       end         type    area    stat    test    final       
10/1/2022   11/1/2022   12/1/2022   BB      NY      10      0       1/1/2022        
11/1/2022   12/1/2022   01/1/2023   BB      NY      5       1       1/1/2022        
10/1/2022   11/1/2022   12/1/2022   AA      NY      80      1       1/1/2022        
11/1/2022   12/1/2022   01/1/2023   AA      NY      90      0       1/1/2022        
10/1/2022   11/1/2022   12/1/2022   BB      CA      6       3       1/1/2022        
11/1/2022   12/1/2022   01/1/2023   BB      CA      7       2       1/1/2022        
10/1/2022   11/1/2022   12/1/2022   AA      CA      100     1       1/1/2022        
11/1/2022   12/1/2022   01/1/2023   AA      CA      0       8       1/1/2022

当前尝试的代码

df = df.set_index(["Date", "start", "end"])
new_df = pd.concat([pd.Series(c, index=df.index.repeat(df[c]))
                    for c in df]).reset_index(name="type")

# 然后排序
new_df = new_df.sort_values(["Date", "start", "end"], ignore_index=True) 

改进方案

当前代码逻辑不符合需求,它是按列值重复行,而我们需要将BB_stat/AA_stat、BB_test/AA_test这类列拆分为type(AA/BB)、stat、test三列,同时保留其他原始列。推荐使用pandas的wide_to_long方法,更贴合这类宽表转长表的场景:

实现代码

import pandas as pd

# 假设原始数据已加载为DataFrame df
# df = pd.read_csv("your_data.csv")

# 使用wide_to_long拆分列结构
result = pd.wide_to_long(
    df,
    stubnames=['stat', 'test'],  # 要拆分的指标前缀
    i=['Date', 'start', 'end', 'area', 'final'],  # 保留的非拆分列
    j='type',  # 拆分后生成的类别列名
    sep='_',  # 列名中的分隔符
    suffix=r'\w+'  # 匹配列名后缀(AA/BB)
).reset_index()

# 调整排序顺序,与期望输出一致
result = result.sort_values(
    by=['Date', 'start', 'end', 'type'],
    ascending=[True, True, True, False],  # 让BB排在AA前
    ignore_index=True
)

print(result)

代码说明

  • wide_to_long专门处理{类别}_{指标}格式的宽表,自动拆分出类别列,并将对应指标值归类到指定列中,逻辑简洁高效。
  • i参数指定不需要拆分的列,作为基准保留;j定义拆分后生成的类别列名称。
  • 最后通过排序调整行顺序,完全匹配期望输出的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00