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

如何合并两个Polars DataFrame:将交易多分配转为独立列

解决方法

可以通过分组编号+透视的方式实现动态生成分配列,具体步骤如下:

步骤1:给每个交易的分配添加序号

先对分配DataFrame按TransactionIds分组,给组内的每个分配添加从0开始的序号,用来区分同一交易下的不同分配:

import pandas as pd

# 示例数据(可替换为你的真实数据)
transactions_df = pd.DataFrame({
    'TransactionIds': ['T001', 'T002', 'T003'],
    'OtherCol': ['A', 'B', 'C']
})

assignments_df = pd.DataFrame({
    'TransactionIds': ['T001', 'T001', 'T002', 'T003'],
    'Assignments': ['Alice', 'Bob', 'Charlie', None]
})

# 生成组内序号
assignments_df['assign_seq'] = assignments_df.groupby('TransactionIds').cumcount()

步骤2:透视转换为宽表

将分配数据透视,把序号转为列名,Assignments作为值,自动生成对应数量的分配列:

# 透视生成宽表,重命名列名
assignments_wide = assignments_df.pivot(
    index='TransactionIds',
    columns='assign_seq',
    values='Assignments'
).rename(columns=lambda x: f'Assignment_{x+1}')  # 列名改为Assignment_1、Assignment_2这类直观名称

步骤3:合并交易表与分配宽表

将透视后的分配表和交易表按TransactionIds合并,不足的分配列会自动填充NaN(可按需转为NULL):

# 左连接合并,保留所有交易记录
final_df = transactions_df.merge(assignments_wide, on='TransactionIds', how='left')

# 可选:将NaN替换为字符串'NULL'(如果需要匹配数据库格式)
final_df = final_df.fillna('NULL')

关键说明

  • 该方法会自动根据所有交易中最多的分配数生成对应列数,无需手动指定列的数量。比如某交易有3个分配,就会生成3个分配列,其他交易不足的位置自动填充空值。
  • 如果你之前用groupby+agg(list)得到了列表格式的分配,也可以用pd.DataFrame(df['Assignments'].tolist(), index=df.index)展开列表为列,但分组+透视的方法更稳健,能直接处理NULL值和不同长度的分配场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:15:08