如何用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
相关产品推荐
相关产品推荐

