Pandas DataFrame 按发票归组转置明细实现单发票多列宽表
Pandas 非规整发票表转宽表落地实现
原始数据结构特征
表格包含两类无显式分组标记的行:
- 发票头主行:
Document type、Invoicenumber、Invoicedate字段非空,承载单张发票的核心主信息 - 明细行项目:紧邻对应发票头行下方,
Document type字段值为0,归属上方相邻的发票,是发票下的独立交易明细
输出目标为整合同属一张发票的所有明细到同一行:对description、quantity、unit price、line amount类明细字段,按明细出现顺序添加#数字后缀生成独立列(如description#1、quantity#2),最终得到每张发票对应一行的规整宽表。
已尝试的无效操作
- 直接基于原始行索引对明细行做转置,无法正确匹配明细与所属发票的映射关系,出现列值错配
- 通过
pd.DataFrame.from_dict构造测试样例、传入字典参数用pd.DataFrame(data=d1)初始化表结构,均未生成符合预期的列映射规则
可落地实现步骤
- 绑定行级发票归属
对Invoicenumber、Invoicedate、Document type三个主信息字段执行向前填充,将发票头的主信息值向下覆盖到同组的所有明细行,用填充完成的Invoicenumber作为后续分组的唯一标识,无需手动识别分组边界 - 生成明细顺序序号
按分组标识拆分数据后,仅对Document type == 0的明细行做组内累计计数,从1开始生成连续整数序号,作为后续列名的拼接后缀 - 重命名明细字段避免列冲突
对目标明细字段,将原字段名与生成的序号拼接为带#后缀的新列名,保证不同明细行的同名字段在转宽表后不会出现覆盖 - 聚合生成宽表
按发票分组标识聚合时,主信息字段直接取组内首个非空值,明细字段按照重命名后的列名做值展开,最终输出每行对应单张发票的规整结构
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

