如何用Python将含id与Doct_id的DataFrame转换为指定宽表?
长表转宽表(含医生ID列)实现方案
输入数据
| id | Doct_id |
|---|---|
| 1021 | 355 |
| 2010 | 355 |
| 2010 | 358 |
| 6120 | 358 |
| 21201 | 358 |
期望输出
| Doct_id | id_1 | id_2 | id_3 |
|---|---|---|---|
| 355 | 1021 | 2010 | |
| 358 | 2010 | 6120 | 21201 |
注:你给出的期望输出中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
相关产品推荐
相关产品推荐

