如何在Python的Pandas DataFrame中实现值的移位操作?
实现需求的解决方案
你想要把每个重复ID组的第二行ID替换为下一个唯一ID,同时保留原value,形成衔接式的结果。这里提供两种实现思路,兼顾直观性和高效性:
方法一:循环处理(逻辑清晰易理解)
这种方式逐个处理每个ID组,适合快速理解需求逻辑:
import pandas as pd # 原始数据 d = {'ID': ["A", "A", "B", "B", "C", "C", "D", "D", "E", "E", "F", "F"], 'value': [23, 23, 52, 52, 36, 36, 46, 46, 9, 9, 110, 110]} df = pd.DataFrame(data=d) # 获取所有唯一ID列表 unique_ids = df['ID'].unique() # 初始化结果DataFrame result = pd.DataFrame(columns=df.columns) # 遍历每个ID(跳过最后一个,因为它没有后续ID) for i in range(len(unique_ids)-1): current_id = unique_ids[i] next_id = unique_ids[i+1] # 提取当前ID的两行数据 current_group = df[df['ID'] == current_id] # 添加第一行(保持原样) result = pd.concat([result, current_group.iloc[[0]]]) # 修改第二行的ID为下一个ID后添加 modified_row = current_group.iloc[[1]].copy() modified_row['ID'] = next_id result = pd.concat([result, modified_row]) # 重置索引 result = result.reset_index(drop=True) print(result)
方法二:向量化操作(高效简洁,适合大数据集)
利用Pandas的向量化特性避免循环,处理大规模数据时性能更优:
import pandas as pd # 原始数据 d = {'ID': ["A", "A", "B", "B", "C", "C", "D", "D", "E", "E", "F", "F"], 'value': [23, 23, 52, 52, 36, 36, 46, 46, 9, 9, 110, 110]} df = pd.DataFrame(data=d) # 获取所有唯一ID列表 unique_ids = df['ID'].unique() # 创建映射关系:当前ID → 下一个ID id_mapping = dict(zip(unique_ids[:-1], unique_ids[1:])) # 复制原始数据作为结果基础 result = df.copy() # 定位每个ID组的第二行(奇数索引行) odd_rows_mask = result.index % 2 == 1 # 替换奇数行的ID result.loc[odd_rows_mask, 'ID'] = result.loc[odd_rows_mask, 'ID'].map(id_mapping) # 移除最后两行(F没有后续ID,目标结果中也无此部分) result = result.iloc[:-2].reset_index(drop=True) print(result)
最终输出结果
两种方法都会生成你期望的DataFrame:
ID value 0 A 23 1 B 23 2 B 52 3 C 52 4 C 36 5 D 36 6 D 46 7 E 46 8 E 9 9 F 9
核心逻辑说明
- 每个ID的第一行数据保持完全不变
- 每个ID的第二行仅替换
ID为下一个唯一ID,value保留原数值 - 最后移除无后续ID的F组数据,匹配你给出的目标结果格式
内容的提问来源于stack exchange,提问作者Jiayu Zhang
相关产品推荐
相关产品推荐

