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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:33