如何在Pandas中高效还原重复行(保留原位置与处理结果)
高效实现重复行DataFrame的去重处理与还原
需求说明
处理包含大量重复行的大型Pandas DataFrame时,需要完成以下操作:
- 先对数据去重,仅对唯一行执行后续处理(如机器学习任务)
- 处理完成后将重复行还原至原位置,且所有重复行继承对应唯一行的处理结果
原实现通过Python循环追踪重复行结构,效率极低,需利用Pandas内置高效方法完成优化。
高效解决方案
核心思路是用矢量化操作替代循环,通过为每行分配唯一组标识,实现处理结果的快速映射,步骤如下:
- 为原DataFrame生成组标识:标记每行对应的唯一行组
- 提取唯一行并执行自定义处理
- 利用组标识将处理结果快速映射回原DataFrame结构
完整代码实现
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame([[0, 1], [0, 0], [1, 0], [1, 1], [0, 0], [1, 1], [1, 2], [0, 0]], columns=['X', 'Y']) print("原DataFrame:") print(df) # 步骤1:生成组标识 - 相同行分配相同ID _, group_ids = pd.factorize(df.apply(tuple, axis=1)) # 步骤2:提取唯一行并执行处理 df_unique = df.drop_duplicates().reset_index(drop=True) # 自定义处理逻辑(示例:X列+1,Y列*2) df_unique['X'] += 1 df_unique['Y'] *= 2 print("\n处理后的唯一行:") print(df_unique) # 步骤3:映射处理结果回原结构 df_reinstated = df_unique.loc[group_ids].set_index(df.index) print("\n还原后的完整DataFrame:") print(df_reinstated)
输入输出验证
输入(原DataFrame):
X Y 0 0 1 1 0 0 2 1 0 3 1 1 4 0 0 5 1 1 6 1 2 7 0 0
输出(还原后DataFrame):
X Y 0 1 2 1 1 0 2 2 0 3 2 2 4 1 0 5 2 2 6 2 4 7 1 0
关键优化点
- 用
pd.factorize结合行元组编码快速生成组标识,时间复杂度远低于循环查找 - 所有操作均为Pandas矢量化操作,彻底避免Python循环的性能瓶颈
- 还原步骤直接通过索引映射完成,无需逐行赋值操作
内容的提问来源于stack exchange,提问作者Chris Walshaw
相关产品推荐
相关产品推荐

