拼接多个DataFrame后执行去重操作未达预期,结果存在异常差值
问题原因
- 你的实现逻辑存在隐含前提,任一前提不成立都会产生差值:
- 前提1:
df内部不存在完全重复的行。如果df中存在2条及以上完全相同、且未被归入dfA~dfD的行,拼接后这些行的出现次数≥2,drop_duplicates(keep=False)会将这类行全部删除,导致最终unclassified长度小于预期。 - 前提2:
dfA~dfD互相之间没有重叠条目,且四个数据集内部也没有重复条目。如果某条数据同时出现在两个及以上的分类数据集中,四个数据集的长度总和会大于实际已分类的唯一数据量,你用于对比的预期值len(df) - (len(dfA)+len(dfB)+len(dfC)+len(dfD))本身就会偏小,就会出现正差值。
- 前提1:
- 你的代码存在冗余操作隐患:
reset_index后删除首列的操作,如果你原始数据集的列名、列顺序不完全一致,可能会导致drop_duplicates的重复判断逻辑出错。
正确实现方式
你不需要将df和分类数据集拼接后去重,更稳妥的实现逻辑是先提取所有已分类的唯一数据,再从df中筛出不在已分类集合中的条目,参考代码如下:
# 合并所有分类数据集并去重,得到全量已分类唯一数据 classified = pd.concat([dfA, dfB, dfC, dfD]).drop_duplicates() # 左连接匹配,筛选仅在df中存在的条目 unclassified = df.merge(classified, how='left', indicator=True) unclassified = unclassified[unclassified['_merge'] == 'left_only'].drop(columns='_merge')
用上述代码执行后再对比长度,结果就会符合预期。
内容的提问来源于stack exchange,提问作者iamakhilverma
相关产品推荐
相关产品推荐

