2016-09-22 80 views
1

我需要查看列['b']中的所有行,如果该行不是空的,请转到另一个相应的列['c']并删除此特定的重复项索引针对第三列['c']中的所有其他行,同时保留此特定索引。我遇到了drop_duplicates,但是我无法找到一种方法来查找突出显示的行的重复项,而不是列中的所有重复项。我不能在整个列上使用drop_duplicates,因为我想在此列中保留可能对应于列['b']中的空值的重复项。如果在['b']中找到非空值,则可以转到['c']中的当前索引并找到该索引的所有重复项并将其删除。这些重复项可以对应['b']中的空或非空值。如果在['b']中找到空值,则跳至下一个索引。通过这种方式,可能会间接移除['b']中的空值索引,因为它们是['c']中与非空[[b']值对应的索引的重复项。python pandas如何有选择地删除重复项

编辑样本数据:

预处理的:

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列下一个值

+3

能否请您提供一些数据样本? (http://stackoverflow.com/help/mcve) – Thanos

+1

And:[如何制作好重现熊猫的例子](http:// stackoverflow。问题/ 20109391 /如何制作好可重现的熊猫示例) – IanS

+0

用数据示例编辑 – lucas305

回答

0

说你根据你的组数据框到'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 
+0

这看起来非常有前途 - 谢谢!但是,我遇到了一些错误:'ValueError:标签['level_1']不包含在axis'中。我运行它的方式是做df2 = df1.groupby ......是不正确的? – lucas305

+0

@ lucas305不知道你为什么得到那个,但是带有'level_1'的部分在任何情况下都是多余的,我将它删除了。你可以根据上面的更新再试一次吗? –

+0

好的!运行没有错误。然而,这并不是我需要的输出 - 信息丢失太多了。因此,在原始df中,每行都由与该行中特定数据相对应的分子标识符进行索引。由于索引现在只是从0到n的整数,转换后就会丢失。此外,新的DFF转换只有列B和C所有其他列已被删除。我需要保留所有其他信息。基本上这应该只能删除重复,但保持其他一切。 – lucas305