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

基于条件创建并填充DataFrame列:拆分合同SCHEDULED字段

实现DataFrame分组转多列的需求

原始数据结构

Customer       CONTRACT_ID      PHASING_DATE    SCHEDULED    ARTICLE_CODE
A              C0218            2021-01-01      21           001
A              COZ19            2021-01-01      23           001
A              IUD80            2021-01-01      43           001
A              PAZO1            2021-02-01      12           002
B              DZAP2            2021-01-01      3            003
B              DZAH8            2021-01-01      4            003
B              FGIG0            2021-03-01      5            003
C              SDFH4            2021-01-01      4            004
C              AZFE3            2021-04-01      54           005
C              DAZJ9            2021-04-01      32           005
..

需求说明

按Customer、PHASING_DATE、ARTICLE_CODE分组,将每组内的SCHEDULED值依次填充到SCHEDULED_CT_1至SCHEDULED_CT_N列(N为所有分组中最大的合同数),分组内数据不足N个的位置补0,最终输出格式如下:

CUSTOMER  DATE        ARTICLE_CODE    SCHEDULED_CT_1   SCHEDULED_CT_2      SCHEDULED_CT_3    SCHEDULED_CT_4
A         2021-01-01  001             21               23                  43                0
B         2021-01-01  003             3                4                   0                 0
C         2021-01-01  004             4                0                   0                 0
A         2021-02-01  002             12               0                   0                 0
B         2021-03-01  003             5                0                   0                 0
C         2021-04-01  005             54               32                  0                 0       

实现代码

用Pandas可以通过以下步骤完成:

import pandas as pd

# 假设原始数据存放在df中
df = pd.DataFrame({
    'Customer': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'CONTRACT_ID': ['C0218', 'COZ19', 'IUD80', 'PAZO1', 'DZAP2', 'DZAH8', 'FGIG0', 'SDFH4', 'AZFE3', 'DAZJ9'],
    'PHASING_DATE': ['2021-01-01', '2021-01-01', '2021-01-01', '2021-02-01', '2021-01-01', '2021-01-01', '2021-03-01', '2021-01-01', '2021-04-01', '2021-04-01'],
    'SCHEDULED': [21, 23, 43, 12, 3, 4, 5, 4, 54, 32],
    'ARTICLE_CODE': ['001', '001', '001', '002', '003', '003', '003', '004', '005', '005']
})

# 给每个分组内的行添加从1开始的序号
df['ct_num'] = df.groupby(['Customer', 'PHASING_DATE', 'ARTICLE_CODE']).cumcount() + 1

# 透视转宽表,重命名列名
pivot_df = df.pivot(
    index=['Customer', 'PHASING_DATE', 'ARTICLE_CODE'],
    columns='ct_num',
    values='SCHEDULED'
).rename(columns=lambda x: f'SCHEDULED_CT_{x}')

# 填充缺失值为0,重置索引并调整列名、列顺序
result = pivot_df.fillna(0).astype(int).reset_index()
result = result.rename(columns={'Customer': 'CUSTOMER', 'PHASING_DATE': 'DATE'})

# 确保列按SCHEDULED_CT_1到SCHEDULED_CT_N排序
max_ct = pivot_df.columns.nunique()
result = result[['CUSTOMER', 'DATE', 'ARTICLE_CODE'] + [f'SCHEDULED_CT_{i}' for i in range(1, max_ct+1)]]

print(result)

代码说明

  • cumcount()用于给每个分组内的行生成序号,加1后匹配SCHEDULED_CT_N的N值
  • pivot()将长表转为宽表,把分组内的SCHEDULED值按序号映射到对应列
  • fillna(0)补全缺失值,astype(int)确保结果为整数类型
  • 最后调整列名和顺序,完全匹配预期输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:54:26