Pandas一对多合并:将同主键多行转换为单行多列
解决Pandas一对多合并后生成带后缀列的需求
没问题,这种把一对多关联的多条数据转成同一条记录下带后缀列的场景很常见,我给你一步步拆解实现方法,用示例数据演示更直观。
首先,先模拟你的数据场景(你可以直接替换成自己的真实DataFrame):
import pandas as pd # 你的main_id表:存储唯一ID列表 main_id = pd.DataFrame({ 'id': ['A', 'B', 'C'] }) # 你的ref_data表:包含重复ID的关联业务数据 ref_data = pd.DataFrame({ 'id': ['A', 'A', 'B', 'C'], 'period': ['2023Q1', '2023Q2', '2023Q1', '2023Q3'], 'quantity': [100, 150, 200, 300] })
接下来按以下步骤操作:
执行一对多左连接
用merge做左连接,确保main_id里的所有ID都被保留,不管有没有匹配的关联数据:merged_df = pd.merge(main_id, ref_data, on='id', how='left')给每个ID的重复条目分配序号
用groupby+cumcount给每个ID下的行从1开始编号,这个序号就是后续列名的后缀:merged_df['entry_num'] = merged_df.groupby('id').cumcount() + 1将行转成带后缀的列
用pivot把同一ID下的多条记录转成列,同时合并列名和序号后缀:# 执行pivot,按id分组,用entry_num作为列的后缀标识 pivoted_df = merged_df.pivot(index='id', columns='entry_num', values=['period', 'quantity']) # 整理多层列名,变成"period_1"、"quantity_2"这类清晰的格式 pivoted_df.columns = [f'{col_name}_{suffix}' for col_name, suffix in pivoted_df.columns] # 把id从索引变回普通列,还原成常规的DataFrame结构 final_df = pivoted_df.reset_index()
最终得到的final_df就是你需要的结果:
| id | period_1 | period_2 | quantity_1 | quantity_2 |
|---|---|---|---|---|
| A | 2023Q1 | 2023Q2 | 100 | 150 |
| B | 2023Q1 | NaN | 200 | NaN |
| C | 2023Q3 | NaN | 300 | NaN |
如果你的数据里有超过2条重复的ID,这个方法会自动生成period_3、quantity_3这类列,完全适配任意数量的重复条目。要是你想把NaN替换成特定值(比如空字符串),可以加一行final_df = final_df.fillna('')来处理。
内容的提问来源于stack exchange,提问作者ac24
相关产品推荐
相关产品推荐

