如何合并两个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
相关产品推荐
相关产品推荐

