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

如何用Pandas DataFrame将列值转置为带序号的新列

问题描述

现有如下DataFrame:

id diag  a_date
0    1   d1      55
1    1   d2      88
2    2   d5      22
3    2   d3      44
4    2   d4      88
5    2   d4      89
6    3   d1      11
7    3   d1      13
8    3   d1      15
9    3   d5      27
10   3   d5      28
11   3   d5      29

可执行以下代码创建该DataFrame:

df = pd.read_clipboard() # 复制上述文本后运行该行代码生成df

需要将其重塑,让diag列的值作为带序号的新列名,对应填入a_date的值,最终效果如下:

id d1_1 d1_2 d1_3 d2_1 d3_1 d4_1 d4_2 d5_1 d5_2 d5_3
0  1   55             88                              
1  2                       44   88   89   22           
2  3   11   13   15                       27   28   29
解决方案

可以通过分组添加序号 + 透视表的方式实现需求,具体代码如下:

import pandas as pd

# 1. 按id和diag分组,为每个组内的行生成从1开始的序号
df['seq'] = df.groupby(['id', 'diag']).cumcount() + 1

# 2. 拼接出目标列名格式:diag值_序号
df['col_name'] = df['diag'] + '_' + df['seq'].astype(str)

# 3. 透视表转换为宽表,id作为行,新列名作为列,填充a_date的值
result = df.pivot(index='id', columns='col_name', values='a_date').reset_index()

# 4. 按列名字母顺序排序,匹配示例的列顺序(可选)
sorted_cols = sorted(result.columns[1:])
result = result[['id'] + sorted_cols]

# 输出结果
print(result.to_string(index=False))

代码说明

  • 分组序号:通过groupby+cumcount为每个用户下的同一种诊断生成递增序号,确保重复的diag能区分成不同列。
  • 列名拼接:把诊断类型和序号组合成要求的列名格式。
  • 透视表重塑:将长表转为宽表,自动把新列名作为表头,对应位置填充a_date的值。
  • 列排序:对生成的列名排序,让结果和示例的列顺序一致,不需要的话可省略该步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:35:23