如何修改Pandas代码实现指定ID顺序、可扩展行列的DataFrame水平重塑
实现方案
以下是最优修改代码,避免了原方案循环拼接的性能问题,同时完美匹配你的两个需求:
import pandas as pd # 示例数据构造,你有实际df可跳过这部分 df = pd.DataFrame({ 'ID': [3,3,1,1,1,5], 'Name': ['Luke','Luke','Marcus','Marcus','Marcus','Julia'], 'Subject': ['Chemistry','Math','Chemistry','Math','History','History'], 'Grade': [8,7,6,10,9,6] }) # 自定义参数 codes = [4, 3, 1, 5, 2] n_group = 4 # 按需调整需要的成绩组数量,示例为4组 # 核心处理逻辑 # 1. 给每个ID下的记录生成组序号 df['group_no'] = df.groupby('ID').cumcount() + 1 # 2. 透视转换为宽表 df_pivot = df.pivot(index='ID', columns='group_no', values=['Name', 'Subject', 'Grade']) # 3. 合并多级列名为单级格式:列名+组号 df_pivot.columns = [f'{col}{no}' for col, no in df_pivot.columns] # 4. 生成目标列列表,对齐到指定组数 expected_cols = [] for i in range(1, n_group + 1): expected_cols.extend([f'Name{i}', f'Subject{i}', f'Grade{i}']) df_pivot = df_pivot.reindex(expected_cols, axis=1) # 5. 按codes顺序对齐ID,缺失ID自动补NaN df_result = df_pivot.reindex(codes).reset_index(names='ID')
执行print(df_result)即可得到你需要的输出结果。
调整说明
- 要修改成绩组数量,直接修改
n_group参数即可,代码会自动补全对应列的NaN值 - 要调整输出ID的顺序和范围,直接修改
codes列表即可
内容的提问来源于stack exchange,提问作者LJG
相关产品推荐
相关产品推荐

