基于条件创建并填充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
相关产品推荐
相关产品推荐

