Pandas DataFrame去除指定重复值实现idx与Deal No一对一映射
你原代码的问题在于iterrows()在循环启动时就生成了基于初始DataFrame的迭代器,后续你对DataFrame做的inplace修改不会更新这个迭代器,所以循环始终读取初始状态的行数据,结果不符合预期。
可以用动态遍历临时表的方案实现需求,代码如下:
import pandas as pd # 保留原始df不修改,创建临时表用于动态删减 tmp_df = test.copy().reset_index(drop=True) # 存储最终的一对一映射结果 result = pd.DataFrame(columns=test.columns) while not tmp_df.empty: # 取当前临时表的第一行作为本次要保留的首个匹配对 current_row = tmp_df.iloc[0] c_idx = current_row['idx'] c_dealno = current_row['Deal No'] # 将匹配对存入结果表 result = pd.concat([result, current_row.to_frame().T], ignore_index=True) # 删除临时表中所有当前Deal No的行 tmp_df = tmp_df[tmp_df['Deal No'] != c_dealno] # 再删除临时表中所有当前idx的行 tmp_df = tmp_df[tmp_df['idx'] != c_idx] # 输出idx和Deal No的映射关系 print(result[['idx', 'Deal No']])
逻辑说明
- 全程操作临时表,不会修改原始数据
- 每次循环都读取当前临时表的第一行作为有效匹配对,保证取到的是当前剩余数据里首次出现的组合
- 存入结果后直接过滤掉所有同idx、同Deal No的行,剩下的数据进入下一轮匹配
- 最终得到的结果表中idx和Deal No都是唯一的,完全符合你要的一对一映射规则,和你给出的示例输出完全一致。
如果需要调整配对的优先级,只需要在创建tmp_df时按你的需求对原始df做排序即可,保证你想优先保留的行排在最前面。
内容的提问来源于stack exchange,提问作者atr1
相关产品推荐
相关产品推荐

