如何将DataFrame中除Name列外相同的相邻两行合并为一行
相邻重复行(除Name列外)的合并方案
原始数据构造
先构造示例DataFrame方便测试:
import pandas as pd df = pd.DataFrame({ 'Name': ['ab', '123', 'de', '456', 'fg', '789'], 'info.1': ['a', 'a', 'c', 'c', 'd', 'd'], 'info.2': [1, 1, 4, 4, 5, 5] })
解决方案
方法一:按info列分组聚合(适配非严格相邻但info列相同的情况)
通过groupby按info.1和info.2分组,将每组的Name值提取为列表,再拆分为Name和ID列:
# 分组聚合获取每组的Name列表 grouped = df.groupby(['info.1', 'info.2'])['Name'].agg(list).reset_index() # 将Name列表拆分为两列 grouped[['Name', 'ID']] = pd.DataFrame(grouped['Name'].tolist(), index=grouped.index) # 调整列顺序并清理冗余列 result = grouped[['Name', 'ID', 'info.1', 'info.2']]
方法二:按索引步长提取(适配严格相邻成对的情况)
利用索引切片直接取偶数行作为Name行,奇数行作为ID行,效率更高:
# 提取偶数行(原始数据的第1、3、5行)作为基础数据 name_df = df.iloc[::2].reset_index(drop=True) # 提取奇数行的Name列作为ID列 id_series = df.iloc[1::2]['Name'].reset_index(drop=True) # 合并两部分数据 result = pd.concat([name_df, id_series.rename('ID')], axis=1)
最终结果
执行上述任意方法后,result的输出为:
Name ID info.1 info.2 0 ab 123 a 1 1 de 456 c 4 2 fg 789 d 5
内容的提问来源于stack exchange,提问作者Clo
相关产品推荐
相关产品推荐

