python pandas如何有选择地删除重复

时间:2016-09-22 16:21:25

标签: python pandas dataframe

我需要查看列['b']中的所有行,如果该行是非空的,请转到另一个相应的列['c']并删除该特定索引的副本,以反映其中的所有其他行第三列['c']同时保留此特定索引。我遇到了drop_duplicates,但是我找不到只查找突出显示行的重复项的方法,而不是查找列中的所有重复项。我不能在整个列上使用drop_duplicates,因为我想在此列中保留重复项,这些副本可能只对应于列['b']中的空值。

所以可能的情况是:如果在['b']中找到非空值,你可以转到['c']中的当前索引并查找该ONE索引的所有重复项并删除它们。这些重复可能对应于['b']中的空OR非空值。如果在['b']中你发现空值跳到下一个索引。这样,['b']中的空值索引可能会被间接删除,因为它们是['c']中与非空['b']值对应的索引的副本。

使用样本数据编辑:

预处理的:

df1 = pd.DataFrame([['','CCCH'], ['CHC','CCCH'], ['CCHCC','CNHCC'], ['','CCCH'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C'])  

df1

    B     C  
0         CCCH
1   CHC   CCCH
2   CCHCC CNHCC
3         CCCH
4   CNHCC CNOCH
5         NCH
6         NCH

后处理并删除正确的重复项:

df2 = pd.DataFrame([['CHC','CCCH'], ['CCHCC','CNHCC'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C'])

df2

    B     C
1   CHC   CCCH
2   CCHCC CNHCC
4   CNHCC CNOCH
5         NCH
6         NCH

上面我们看到的结果是,删除的唯一行是行0,3,因为它们在第1行的列['C']中是重复的,其具有非零'B'值。第5,6行保留,即使它们在列['C']中彼此重复,因为它们没有非零'B'值。保留第2行和第4行,因为它们在列['C']中不重复。

所以逻辑是通过列'B'中的每一行(如果它是空的)然后向下移动一行并继续。如果它不是空的,那么转到相应的列'C'并删除该列'C'行的任何重复项,同时保留该索引然后继续到下一行,直到该逻辑已应用于列'B'中的所有值”。

B列值为空 - >查看B列中的下一个值

|或者如果不是空的话

B栏不为空 - > C栏 - >删除列C的索引的所有重复项,同时保持当前索引 - >查看B列中的下一个值

1 个答案:

答案 0 :(得分:1)

假设您根据'C'列对DataFrame进行分组,并检查每个组是否存在'B' - 列非空条目:

  • 如果没有此类条目,请返回整个组

  • 否则,返回该组,对于'B'中的非空条目,删除重复项

在代码中:

def remove_duplicates(g):                                    
    return g if sum(g.B == '') == len(g) else g[g.B != ''].drop_duplicates(subset='B')

>>> df1.groupby(df1.C).apply(remove_duplicates)['B'].reset_index()[['B', 'C']]
       B      C
0    CHC   CCCH
1  CCHCC  CNHCC
2  CNHCC  CNOCH
3           NCH
4           NCH