【问题标题】:Finding duplicates across multiple groups in a column- Python在列中跨多个组查找重复项 - Python
【发布时间】:2020-02-17 22:16:46
【问题描述】:

我需要一些代码方面的认真帮助。

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

  1. 我首先检查零件编号列中没有空值的行。因为我不希望空值被视为重复项
  2. 如果部件号匹配,对于两个相同的部件号,我会检查制造商列是否有重复。
  3. 如果两行或多行的制造商和部件号相同,我会将结果输出到称为重复级别的新列中。零件编号和制造商完全匹配的所有行的输出都很高。
  4. 但是,如果部件号匹配而制造商不匹配,则列中的输出为“中等”。
  5. 如果部件号本身不匹配,则重复级别为“无重复”
  6. 此外,对于部件号或制造商中为 NA 的行,将重复级别设置为“无重复”以防部件号和“中等”以防制造商。

这是我的输入表 enter image description here

我写的代码是

`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'`

我需要的输出是 enter image description here

我得到的输出是 enter image description here

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

非常感谢。

【问题讨论】:

    标签: python group-by duplicates


    【解决方案1】:

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

    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"
    

    【讨论】:

    • 嗨,你能定义统计数据吗?引发错误。此外,“数据”变量与函数中的“df”初始数据帧相同,对吧?
    • 对这些错误感到抱歉,那是由于我在不同的数据集上对其进行了测试。请查看修改后的代码并再次尝试一下。
    • 嗨,由于未定义状态,仍然会引发错误。你能告诉我这在我的数据集中表示的是哪个变量吗?
    • Partdups 是一个包含重复制造商编号的列表。编号列表包含所有重复的材料编号。然后我们遍历这两个列表。 “状态”列是指您的材料部件号。
    • 您好,感谢您的代码,尝试运行它。但它将列中的 NA 也视为重复,并且 .duplicated 为 NA 提供 True。我不能明确排除制造商为 NA 的行。因为正如我所说,如果零件编号匹配并且制造商是 NA,我仍然希望重复程度适中。您能否查看上面问题中提到的我需要的算法并建议相应地更改您的代码?我会重新运行并让你知道
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多