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
相关产品推荐
相关产品推荐

