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

Pandas基于行值重命名DataFrame列实现数据转换

问题描述

现有输入DataFrame构造代码如下:

import pandas as pd
data = [{'s':123, 'x': 5, 'a': 1, 'b': 2, 'c': 3},
        {'s':123, 'x': 22, 'a': 4, 'b': 5, 'c': 6},
        {'s':123, 'x': 33, 'a': 7, 'b': 8, 'c': 9},
        {'s':124, 'x': 5, 'a': 11, 'b': 12, 'c': 3},
        {'s':124, 'x': 22, 'a': 14, 'b': 15, 'c': 16},
        {'s':124, 'x': 33, 'a': 17, 'b': 18, 'c': 19}]

df = pd.DataFrame(data, columns=['s', 'x', 'a', 'b', 'c'])

输入DataFrame样例:
输入DataFrame样例

需求为生成目标DataFrame:对a/b/c三个指标列,列名追加_<x列对应值>的后缀,最后将s列设为索引,调用to_dict('index')得到最终字典结果。此前尝试转置后用lambda重命名行未得到预期结果。

解决方案

不需要走转置重命名的逻辑,直接用透视表做宽表转换即可,步骤如下:

  • 以s为索引维度、x为列展开维度,对a/b/c三个指标做透视展开,pandas会自动生成(指标名, x值)格式的多级列名
  • 把多级列名拼接为指标名_x值格式的单级列名,即可得到目标df_out
  • 最终设置s为索引直接转字典即可

完整可运行代码:

# 透视展开数据
df_pivot = df.pivot(index='s', columns='x', values=['a', 'b', 'c'])
# 拼接生成目标列名
df_pivot.columns = [f"{col}_{val}" for col, val in df_pivot.columns]
# 生成标准格式的df_out
df_out = df_pivot.reset_index()

# 直接生成最终需要的字典结果
final_result = df_out.set_index('s').to_dict('index')

打印df_out可验证列名符合要求:列分别为s、a_5、a_22、a_33、b_5、b_22、b_33、c_5、c_22、c_33,每个s对应的取值和原始数据完全匹配。
最终输出的字典结构如下:

{
    123: {'a_5': 1, 'a_22': 4, 'a_33': 7, 'b_5': 2, 'b_22': 5, 'b_33': 8, 'c_5': 3, 'c_22': 6, 'c_33': 9},
    124: {'a_5': 11, 'a_22': 14, 'a_33': 17, 'b_5': 12, 'b_22': 15, 'b_33': 18, 'c_5': 3, 'c_22': 16, 'c_33': 19}
}

如果原始数据存在同一个s+x组合对应多条记录的场景,把pivot替换为pivot_table,指定对应聚合函数(比如aggfunc='first')即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:45:36