我需要查看列['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列中的下一个值
答案 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