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

如何用通用方法调整Pandas DataFrame列布局并自定义列名

问题

我有如下所示的DataFrame:

Actual  Expected
F00000191U  F00000191U
2022-09-30  2022-12-20
0.546437    0.546437638135
F00000191U  F00000191U
2022-09-30  2022-12-20
F00000191U  F00000191U
2022-09-30  2022-12-20
0.546437    0.517306000000000
F00000QAXU  F00000QAXU
2022-02-28  2022-07-31

其中字母数字串是唯一的Entity ID作为键,日期与十进制数值均关联该实体ID。例如,F00000191U对应实际日期2022-09-30、实际值0.546437,旁侧为对应预期值。该数据是从某DataFrame提取的不匹配项,我希望将其转换为如下规整横向布局:

Actual Entity ID | Actual start date |Actual Value |Expected Entity ID  |Expected date |Expected val
F00000191U       |2022-09-30         |0.546437     |F00000191U          |2022-12-20    |0.546437638135

作为Pandas新手,想咨询是否有通用方法实现该格式转换?

解决方法

可以通过分组重塑实现,核心是先识别实体组的边界,再将每组的多行数据转成横向字段,具体步骤如下:

  • 标记实体组:
    通过正则匹配识别Entity ID行,生成组ID将连续的关联行归为一组:

    import pandas as pd
    import re
    
    # 假设原始数据已加载为df
    # df = pd.read_csv(...) 或其他方式获取
    
    # 判断是否为Entity ID:匹配字母+数字格式
    is_entity = df['Actual'].str.match(r'^[A-F0-9]+$', na=False)
    # 生成组ID:每次遇到Entity ID就新增一个组
    df['group_id'] = is_entity.cumsum()
    
  • 转置每组数据:
    对每个组进行转置,合并Actual和Expected的字段并调整列名:

    # 分组后转置,将行转为列
    grouped = df.groupby('group_id').apply(
        lambda x: x.set_index(pd.Series(['Entity ID', 'start date', 'Value'], index=x.index))
    ).unstack(0)
    
    # 调整列名,区分Actual和Expected
    grouped.columns = [f'{col[0]} {col[1]}' for col in grouped.columns]
    
    # 重命名列名匹配目标格式
    grouped = grouped.rename(columns={
        'Expected start date': 'Expected date',
        'Expected Value': 'Expected val'
    })
    
    # 重置索引得到最终规整表格
    result = grouped.reset_index(drop=True)
    
  • 处理缺失值:
    对于缺少数值的组(比如最后一组F00000QAXU),结果中对应字段会显示NaN,可按需填充:

    # 可选:用空字符串填充缺失值
    result = result.fillna('')
    

运行后即可得到目标格式的规整DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:43:14