python pandas如何选择性地删除重复项

2024-04-20 08:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要查看列['b']中的所有行,如果该行不是空的,则转到另一个相应的列['c']并将该特定索引的副本相对于第三列['c']中的所有其他行删除,同时保留该特定索引。我遇到了drop\u duplicates,但是我无法找到一种方法来只查找高亮显示行的重复项,而不是一列中的所有重复项。我不能对整列使用drop\u duplicates,因为我希望在该列中保留重复项,这些重复项可能只对应于列['b']中的空值。在

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

用示例数据编辑:

预处理:

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

后处理和删除正确的副本:

^{pr2}$

上面我们看到的结果是,只删除了行0,3,因为它们在第1行的列['C']中是重复的,第1行的“B”值为非零。第5、6行被保留,即使它们在列['C']中是重复的,因为它们没有非零的“B”值。保留第2行和第4行,因为它们在列['C']中不重复。在

所以逻辑是遍历“B”列中的每一行,如果它是空的,那么向下移动一行并继续。如果它不为空,则转到其对应的列“C”,仅在保留该索引的同时删除该列“C”行的任何重复项,然后继续到下一行,直到该逻辑已应用于列“B”中的所有值。在

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

|如果不是空的|

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


Tags: 方法示例副本情况逻辑dropdf1duplicates
1条回答
网友
1楼 · 发布于 2024-04-20 08:10:31

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

  • 如果没有这样的条目,则返回整个组

  • 否则,对于'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

相关问题 更多 >