Pandas如何将同订单号多行合并为单行并新增对应字段列
Pandas 同订单多行记录转单行实现方案
问题说明
- 基于pandas处理订单数据,单个订单最多包含2行记录,每行对应订单的一个组成部分
- 需求:将同一订单对应的2行记录合并为单行,第一条记录的字段保留原列名,第二条记录的字段存入新增的带
2后缀的同名列
示例输入
输入表包含Order_Number、INVENTORY CODE、description1三个字段,以订单号4304为例,对应2行记录:
| Order_Number | INVENTORY CODE | description1 |
|---|---|---|
| 4304 | STDROFENHBSM608.511WH | 8-1/2 x 11, 60# Soporset Digital HiBright Smooth |
| 4304 | STNDEN695WOL | 6 x 9.5 DBL WDW ENVELOPE |
期望输出
同一订单仅保留1行,保留第一条记录的全部字段,新增INVENTORY CODE2、description2存储第二条记录的对应值:
| Order_Number | INVENTORY CODE | description1 | INVENTORY CODE2 | description2 |
|---|---|---|---|---|
| 4304 | STDROFENHBSM608.511WH | 8-1/2 x 11, 60# Soporset Digital HiBright Smooth | STNDEN695WOL | 6 x 9.5 DBL WDW ENVELOPE |
现有代码
目前已完成多源数据合并,但合并结果存在同一Order_Number对应重复行的问题,现有代码如下:
# 定义输入文件路径 infile= ('file1.csv') infile2= ('file2.csv') infile3= ('file3.csv') # 截取文件名生成输出路径 size = len(infile) size2 = len(infile2) outfile = (infile[:size -4]+"_"+infile2[:size2 -4]+"_output.csv") # 读取csv数据为DataFrame df = pd.read_csv(infile, encoding = "ISO-8859-1", engine= 'python') df2 = pd.read_csv(infile2, encoding = "ISO-8859-1", engine= 'python') df3 = pd.read_csv(infile3, encoding = "ISO-8859-1", engine= 'python') # 多表关联 df_merge =df.merge(df2, on='Order_Number', how='left') df_final = pd.merge(df_merge,df3[['PkgID?','Printer', 'Inserter']],on='PkgID?', how='left')
实现代码
在现有合并逻辑之后追加以下代码即可完成行合并:
# 为每个订单内的条目按顺序编号,第一条记为1,第二条记为2 df_final['row_seq'] = df_final.groupby('Order_Number').cumcount() + 1 # 配置字段:同一订单下值完全一致、不需要拆分的字段放入fixed_cols fixed_cols = ['Order_Number', 'PkgID?', 'Printer', 'Inserter'] # 配置字段:同一订单下不同行值不同、需要拆成多列的字段放入pivot_cols pivot_cols = ['INVENTORY CODE', 'description1'] # 行转列完成合并 df_result = df_final.pivot( index=fixed_cols, columns='row_seq', values=pivot_cols ) # 重命名列,第二条记录的字段自动加2后缀 df_result.columns = [ col_name if seq == 1 else f"{col_name}{seq}" for col_name, seq in df_result.columns ] df_result = df_result.reset_index() # 导出结果 df_result.to_csv(outfile, index=False, encoding='ISO-8859-1')
说明:
- 仅包含1条记录的订单,对应的
INVENTORY CODE2、description2字段会自动填充为空值- 如果存在单订单超过2条记录的异常数据,代码会自动生成带3、4后缀的对应列,可提前加过滤逻辑剔除异常数据
- 若有其他同订单值固定的字段,直接加入
fixed_cols列表即可,不需要修改其他逻辑
内容的提问来源于stack exchange,提问作者SemiTurntPanda
相关产品推荐
相关产品推荐

