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

Python/Pandas:如何基于相同merge_id对DataFrame进行自连接以合并同组行

如何将同一merge_id下的两行数据合并为宽格式DataFrame

问题背景

你有如下结构的输入DataFrame:

import pandas as pd

input_df = pd.DataFrame({
    'merge_id': [1, 1, 2, 2],
    'identifier': ['A1', 'B2', 'C1', 'D2'],
    'Location': ['DEL', 'HYD', 'BEN', 'HYD'],
    'Value': [50, 60, 80, 10]
})

期望转换为每行对应一个merge_id,并将同一组的第二行数据以m_前缀的新列展示:

merge_ididentifierLocationValuem_identifierm_Locationm_Value
1A1DEL50B2HYD60
2C1BEN80D2HYD10

解决方案

这里假设每个merge_id下恰好包含两行数据,以下是两种可行的实现方法:


方法一:分组后直接拼接行数据

利用groupby分组,将每组的第一行作为基础,第二行的字段添加m_前缀后合并进去:

def merge_group(group):
    # 取第一行的所有数据
    base_row = group.iloc[0].to_dict()
    # 取第二行的数据,给键添加m_前缀(排除merge_id)
    merged_row = {f'm_{key}': val for key, val in group.iloc[1].items() if key != 'merge_id'}
    # 合并两个字典并转为Series
    return pd.Series({**base_row, **merged_row})

# 分组应用函数,然后重置索引
output_df = input_df.groupby('merge_id').apply(merge_group).reset_index(drop=True)

方法二:添加行标记后透视转换

先给每个merge_id下的行添加序号标记,再通过透视将行转为列,最后整理列名:

# 给每组的行添加0/1的序号
input_df['row_idx'] = input_df.groupby('merge_id').cumcount()

# 透视数据,以merge_id为索引,row_idx为列层次
pivoted_df = input_df.pivot(index='merge_id', columns='row_idx')

# 重新命名列:第一行(0)保留原列名,第二行(1)添加m_前缀
pivoted_df.columns = [f'{col}' if idx == 0 else f'm_{col}' for col, idx in pivoted_df.columns]

# 重置索引得到最终结果
output_df = pivoted_df.reset_index()

两种方法都能得到你期望的输出结构,你可以根据自己的代码习惯选择合适的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:58:14