如何将pandas DataFrame第一列作为列名实现表转置
解决方案
你需要实现的是行列互转的宽表重构需求,无需使用pivot_table,用更轻量的转置方法即可实现,支持动态识别A开头的列、动态适配PRD列的取值,无需硬编码列名。
步骤1:构造示例测试数据(可跳过)
import pandas as pd # 对应你给出的源DataFrame结构 df = pd.DataFrame({ 'PRD': ['DN', 'AV', 'PVAL'], 'A1': ['12', 'uy-9', 12.9], 'A2': ['67-1', 'iu-9', 1.9], 'A3': ['34', 'uyt', 2.3], 'A4': ['98', 'tr', 3.9], 'A5': ['07', 'uytq', 6.9], 'A6': ['45', 'hbg', 8.0], 'A7': ['29', 'nba', 12] })
步骤2:核心转换代码
方法1:直接转置(最简写法)
将PRD列设为索引后直接转置,再重置索引即可得到目标结构,自动适配所有A列和PRD的取值:
res = df.set_index('PRD').T.reset_index(names='PRD')
低版本pandas兼容写法
如果你的pandas版本低于1.5.0,不支持reset_index的names参数,改用以下写法:
res = df.set_index('PRD').T.reset_index() # 重命名首列,其余列名自动继承PRD的取值无需手动指定 res = res.rename(columns={'index': 'PRD'})
输出验证
转换后的res结构和你需要的目标完全一致:
| PRD | DN | AV | PVAL |
|---|---|---|---|
| A1 | 12 | uy-9 | 12.9 |
| A2 | 67-1 | iu-9 | 1.9 |
| A3 | 34 | uyt | 2.3 |
| A4 | 98 | tr | 3.9 |
| A5 | 07 | uytq | 6.9 |
| A6 | 45 | hbg | 8.0 |
| A7 | 29 | nba | 12 |
补充说明
pivot_table多用于需要对重复值做聚合统计的场景,你的需求本质是纯行列转置,用上面的转置方法性能更高、写法更简单。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

