如何使用pandas将同ID的两行数据横向合并为单行格式
pandas按ID分组横向拼接行数据实现方案
核心逻辑是按ID分组后,将组内2条数据拆分为两个子集,再横向合并,按需调整列名和顺序即可。
实现代码
import pandas as pd # 1. 加载/构造原始数据 df = pd.DataFrame({ 'ID': [1, 1, 2, 2], 'Name': ['X', 'Y', 'A', 'y'], 'm1': [2, 1, 2, 5], 'm2': [6, 2, 4, 6], 'm3': [6, 3, 7, 7] }) # 2. 拆分同ID下的两组数据 # 取每组第一行数据,Name列加后缀1 df_group1 = df.groupby('ID', as_index=False).nth(0) df_group1 = df_group1.rename(columns={'Name': 'Name1'}) # 取每组第二行数据,所有字段加后缀2,保留ID列用于关联 df_group2 = df.groupby('ID', as_index=False).nth(1).add_suffix('2').rename(columns={'ID2': 'ID'}) # 3. 按ID横向拼接两组数据 result = pd.merge(df_group1, df_group2, on='ID') # 4. 调整列顺序匹配目标格式 result = result[['ID', 'Name1', 'm1', 'm2', 'm3', 'Name2', 'm12', 'm22', 'm32']] # 若要严格匹配示例里无后缀的重复列名(不推荐,会导致后续列索引歧义),可追加重命名操作 # result.columns = ['ID', 'Name1', 'm1', 'm2', 'm3', 'Name2', 'm1', 'm2', 'm3']
输出结果
执行代码后得到的result和需求逻辑完全匹配(你给出的示例中ID=2对应的第二行m1值写为6属于笔误,原始数据中该值为5,代码输出为正确值):
| ID | Name1 | m1 | m2 | m3 | Name2 | m12 | m22 | m32 |
|---|---|---|---|---|---|---|---|---|
| 1 | X | 2 | 6 | 6 | Y | 1 | 2 | 3 |
| 2 | A | 2 | 4 | 7 | y | 5 | 6 | 7 |
适配提示:如果单个ID对应超过2行数据,可以在分组后通过循环给每组数据加不同序号,再用
pivot方法做行转列即可通用适配。
内容的提问来源于stack exchange,提问作者Peter J
相关产品推荐
相关产品推荐

