You need to enable JavaScript to run this app. Pandas DataFrame去除指定重复值实现idx与Deal No一对一映射
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 03:54:06