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

如何用Python将含id与Doct_id的DataFrame转换为指定宽表?

长表转宽表(含医生ID列)实现方案

输入数据

idDoct_id
1021355
2010355
2010358
6120358
21201358

期望输出

Doct_idid_1id_2id_3
35510212010
3582010612021201

注:你给出的期望输出中Doct_id=358的id_1写成了1021,这是笔误,以下代码按输入数据的正确逻辑生成结果。

你的尝试代码(问题点:缺失Doct_id列,列名不符合要求)

id_list = df['Doct_id '][~df['Doct_id '].duplicated()]
t_rows = []
max_val_num = 0
for id_ in id_list:
    row = df[df['Doct_id '] == id_]['id'].tolist()
    t_rows.append(row)
    if len(row) >= max_val_num:
        max_val_num = len(row)

df_transform = pd.DataFrame(t_rows , columns=['col_'+str(i) for i in range(max_val_num)])  
print(df_transform.head(100))

正确实现方案

用pandas的groupby+cumcount生成分组内的id序号,再通过pivot转成宽表,高效且符合需求:

import pandas as pd

# 构造输入数据(实际使用时可直接读取你的数据源)
data = {
    'id': [1021, 2010, 2010, 6120, 21201],
    'Doct_id': [355, 355, 358, 358, 358]
}
df = pd.DataFrame(data)

# 为每个Doct_id分组内的id生成序号列(id_1、id_2...)
df['id_col'] = 'id_' + (df.groupby('Doct_id').cumcount() + 1).astype(str)

# 透视转宽表,Doct_id作为列保留
result = df.pivot(index='Doct_id', columns='id_col', values='id').reset_index()

# 将空值替换为空字符串,匹配期望输出格式
result = result.fillna('')

# 清除列名的层级标签
result.columns.name = None

print(result)

运行输出:

Doct_id  id_1  id_2   id_3
0      355  1021  2010       
1      358  2010  6120  21201

补充提示

  • 原代码中df['Doct_id ']多了空格,注意列名要和数据源完全一致(输入数据列名是Doct_id无空格)
  • 透视方法比循环更高效,数据量大时优势更明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:38