Pandas对比父子DataFrame时触发标签不一致ValueError排查
错误原因
Pandas 内置的DataFrame.compare()方法有严格的前置校验规则:参与对比的两个DataFrame必须拥有完全一致的列名、行索引与维度形状,只要有一项不匹配就会抛出ValueError: Can only compare identically-labeled DataFrame objects错误。
你的场景中报错的核心逻辑非常明确:调用drop_duplicates()去重时,pandas默认会保留留存行的原始行索引、不会自动重置索引,最终得到的ddf仅保留4条非重复数据,行索引为[0,1,2,3],和原始df的6行结构(索引范围0-5)相比,维度、索引序列都不匹配,完全不满足compare方法的调用要求。
修复方案
根据实际需求选择对应方案即可:
- 如果只是要定位原始数据里被去重逻辑删除的重复行,根本不需要调用compare,用
duplicated()方法就能直接标记所有重复条目:
import pandas as pd series = [('Stranger Things', 3, 'Millie'), ('Game of Thrones', 8, 'Emilia'), ('La Casa De Papel', 4, 'Sergio'), ('Westworld', 3, 'Evan Rachel'), ('Stranger Things', 3, 'Millie'), ('La Casa De Papel', 4, 'Sergio')] df = pd.DataFrame(series, columns=['Name', 'Seasons', 'Actor']) # keep=False 会将所有重复出现的行(包括首次出现的条目)统一标记为重复 df['is_duplicated'] = df.duplicated(subset=['Name', 'Seasons', 'Actor'], keep=False) print(df)
- 如果你确实需要用compare方法输出标准化的两数据集差异结果,可以先通过
reindex把去重后的DataFrame对齐到原始df的索引,补全缺失行位后再执行对比:
ddf = df.drop_duplicates(subset =['Name', 'Seasons', 'Actor'], keep = 'first') # 对齐原始df的行索引,缺失行位置默认填充空值 ddf_aligned = ddf.reindex(df.index) # 此时可正常调用compare,输出结果即为去重操作移除的行内容 print(df.compare(ddf_aligned))
内容的提问来源于stack exchange,提问作者Suffii
相关产品推荐
相关产品推荐

