Pandas实现字段名转值、逐行解聚合及长表转换
调整建议与解决方案
问题分析
需要将带有Low/Middle/High前缀的Stat/Stat1列进行长表转换,同时保留所有其他列(Re、Set等),并生成对应Range列。
原始数据
# create DataFrame data = { "Start": ['8/1/2013', '8/1/2013'], "Date": ['9/1/2013', '9/1/2013'], "End": ['10/1/2013', '10/1/2013'], "Area": ['NY', 'CA'], "Final": ['3/1/2023', '3/1/2023'], "Type": ['CC', 'AA'], "Middle Stat": [226, 130], "Low Stat": [20, 50], "High Stat": [10, 0], "Middle Stat1": [0, 0], "Low Stat1": [0, 0], "High Stat1": [0, 0], "Re": [0,0], "Set": [0,0], "Set2": [0,0], "Set3": [0,0], }
期望输出
data = {'Start': ['8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013'], "Date": ['9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013'], "End": ['10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013'], "Area": ['NY', 'CA', 'NY', 'CA', 'NY', 'CA'], "Final": ['3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023'], "Type": ['CC', 'AA', 'CC', 'AA', 'CC', 'AA'], "Stat": [20, 50, 226, 130, 10, 0], "Range": ['Low', 'Low', 'Middle', 'Middle', 'High', 'High'], "Stat1": [0, 0, 0, 0, 0, 0], "Re": [0, 0, 0, 0, 0, 0], "Set": [0, 0, 0, 0, 0, 0], "Set2": [0, 0, 0, 0, 0, 0], "Set3": [0, 0, 0, 0, 0, 0] }
调整后的代码
当前代码遗漏了Re、Set等需要保留的列,以下是修正后的实现:
import pandas as pd import janitor # 构建原始DataFrame df = pd.DataFrame(data) # 执行长表转换 result_df = (df .pivot_longer( # 保留所有不需要转换的列作为索引 index=['Start', 'Date', 'End', 'Area', 'Final', 'Type', 'Re', 'Set', 'Set2', 'Set3'], # 用正则匹配所有需要转换的统计列,更灵活 columns=r'^(Low|Middle|High) (Stat|Stat1)$', # 将列名拆分为Range(前缀)和值列名(Stat/Stat1) names_to=('Range', '.value'), names_sep=' ' ) # 按Low→Middle→High排序,匹配期望输出的行顺序 .sort_values('Range', key=lambda x: x.map({'Low': 0, 'Middle': 1, 'High': 2})) .reset_index(drop=True) ) # 查看结果(与期望输出一致) print(result_df.to_dict('list'))
关键调整点
- 补充索引列:将
Re、Set、Set2、Set3加入index参数,确保这些列在转换后完整保留。 - 灵活匹配转换列:使用正则表达式
r'^(Low|Middle|High) (Stat|Stat1)$'自动匹配所有目标列,避免手动列名的繁琐。 - 排序对齐输出:通过
sort_values指定Range的排序逻辑,让结果行顺序与期望输出一致。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

