在列中跨多个组查找重复项-Python

在列中跨多个组查找重复项-Python,python,group-by,duplicates,Python,Group By,Duplicates,我需要一些非常认真的代码帮助 我有一个数据框,在其中我想在两列中找到重复项-材料零件号和制造商。这些列有空值。我需要找到副本的方法如下 我首先检查partnumber列中没有空值的行。因为我不希望将空值视为重复值 如果零件号匹配,对于两个相同的零件号,我检查“制造商”列中是否有重复的零件号 如果两行或更多行的制造商号和零件号都相同,我会将结果输出到一个名为levelofduplicity的新列中。零件号和制造商完全匹配的所有行的输出都很高 但是,如果零件号匹配而制造商不匹配,则列中的输出为“中等

我需要一些非常认真的代码帮助

我有一个数据框,在其中我想在两列中找到重复项-材料零件号和制造商。这些列有空值。我需要找到副本的方法如下

  • 我首先检查partnumber列中没有空值的行。因为我不希望将空值视为重复值
  • 如果零件号匹配,对于两个相同的零件号,我检查“制造商”列中是否有重复的零件号
  • 如果两行或更多行的制造商号和零件号都相同,我会将结果输出到一个名为levelofduplicity的新列中。零件号和制造商完全匹配的所有行的输出都很高
  • 但是,如果零件号匹配而制造商不匹配,则列中的输出为“中等”
  • 如果零件号本身不匹配,则重复级别为“无重复”
  • 此外,对于零件号或制造商中为NA的行,如果零件号为“无重复”,则重复级别为“无重复”,如果制造商为“中等”
  • 这是我的输入表

    我为同样的目的编写的代码是

    `for i in range(len(df)):
        if pd.isnull(df.loc[i,'Material Part Number'])==False:
            if (df['Material Part Number'].duplicated(keep=False))[i]==True:
                if pd.isnull(df.loc[i,'Manufacturer'])==False:
                    if (df['Manufacturer'].duplicated(keep=False))[i]==True:
                            df.loc[i,'Level of Duplicacy']='High'
                    else:
                            df.loc[i,'Level of Duplicacy']='Moderate'
                else:
                     df.loc[i,'Level of Duplicacy']='Moderate'
            else:
                df.loc[i,'Level of Duplicacy']='Not duplicate'
        else:
             df.loc[i,'Level of Duplicacy']='Not duplicate'`
    
    我需要的输出是

    我得到的结果是

    正如您在以黄色突出显示的行中所看到的,我的代码不是在一个特定/唯一的零件号内比较制造商,而是在所有零件号之间进行比较,我不希望它这样做。我知道.duplicated()函数会对整个列进行比较,但是如果我希望它在每个唯一的零件号内进行比较,然后找到匹配项,该怎么办?更像是一个重复的groupby?你们中有人能帮我修改我写的代码吗


    非常感谢。

    在数据框中运行循环需要对每个项目进行元素级比较。我建议使用矩阵代数来实现这一点。看看下面,这可能会有所帮助

    df["Level of Duplicacy"] = "Not Duplicate"
    Partdups = df.loc[df["Material Part Number"].duplicated(),"Material Part Number"].unique()
    for dup in Partdups:
        Nums = df.loc[df["Material Part Number"] == dup,:]
        dupNums = Nums.loc[Nums["Manufacturer"].duplicated(),"Manufacturer"].unique()
        for num in dupNums:
            Nums.loc[Nums["Manufacturer"] == num,"Level of Duplicacy"] = "High"
            Nums.loc[Nums["Manufacturer"] != num,"Level of Duplicacy"] = "Moderate"
            df.iloc[Nums["Material Part Number"].index,:] = Nums
    
    df.loc[pd.isnull(df["Material Part Number"]),"Level of Duplicacy"] = "Not Duplicate"
    

    嗨,你能定义统计数据吗?抛出一个错误。另外,“data”变量与初始数据帧相同,在函数中也是“df”,对吗?对于这些错误,很抱歉,这是因为在我这边的不同数据集上测试它。请看一看修改后的代码,然后再次运行。您好,由于状态未定义,仍然会抛出错误。您能告诉我在我的数据集中指示了哪个变量吗?Partdups是一个包含重复制造商编号的列表。Nums列表包含所有重复的物料编号。然后我们循环浏览这两个列表。“状态”一栏指的是您的物料零件号。您好,谢谢您的代码,尝试运行它。但它也将列中的NAs视为重复和。重复为NAs提供了True。我不能明确排除制造商为NA的行。因为正如我所说,如果零件号匹配且制造商为NA,我仍然希望重复性水平适中。你能看看我在上述问题中所要求的算法,并建议相应地修改代码吗?我会重新运行并让您知道