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_id | identifier | Location | Value | m_identifier | m_Location | m_Value |
|---|---|---|---|---|---|---|
| 1 | A1 | DEL | 50 | B2 | HYD | 60 |
| 2 | C1 | BEN | 80 | D2 | HYD | 10 |
解决方案
这里假设每个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
相关产品推荐
相关产品推荐

