行数不等的Pandas DataFrame比对生成结果遇ValueError问题
解决行数不等的Pandas DataFrame对比问题
问题需求
对比两个行数不相等的Pandas DataFrame,生成新的DataFrame:
- 匹配的记录标记为
True - 不匹配及缺失的记录标记为
False
示例数据
df1:
date x y 0 2022-11-01 4 5 1 2022-11-02 12 5 2 2022-11-03 11 3
df2:
date x y 0 2022-11-01 4 5 1 2022-11-02 11 5
预期输出
df_output:
date x y 0 True True True 1 False False False 2 False False False
报错代码及信息
运行以下代码时报错:
import pandas as pd import numpy as np df1 = pd.DataFrame({'date':['2022-11-01', '2022-11-02', '2022-11-03'],'x':[4,12,11],'y':[5,5,3]}) df2 = pd.DataFrame({'date':['2022-11-01', '2022-11-02'],'x':[4,11],'y':[5,5]}) df_output = pd.DataFrame(np.where(df1 == df2, True, False), columns=df1.columns) print(df_output)
报错信息:
ValueError: Can only compare identically-labeled DataFrame objects
报错原因
Pandas要求对比的DataFrame必须行列标签完全一致,包括行数、列数以及索引。这里df1有3行,df2仅2行,直接用==对比会触发标签不匹配的错误。
解决方案
先将df2对齐到df1的行索引,缺失行用NaN填充,再进行对比:
import pandas as pd import numpy as np df1 = pd.DataFrame({'date':['2022-11-01', '2022-11-02', '2022-11-03'],'x':[4,12,11],'y':[5,5,3]}) df2 = pd.DataFrame({'date':['2022-11-01', '2022-11-02'],'x':[4,11],'y':[5,5]}) # 将df2对齐到df1的行索引,缺失行填充NaN df2_aligned = df2.reindex(df1.index) # 逐元素对比,不匹配或缺失都标记为False df_output = (df1 == df2_aligned).fillna(False) print(df_output)
代码说明
df2.reindex(df1.index):让df2使用df1的行索引,缺失的行(如索引2)对应列的值自动填充为NaNdf1 == df2_aligned:逐元素对比,相等为True,不相等为False,缺失位置会得到NaN.fillna(False):把所有NaN替换为False,满足“缺失记录标记为False”的需求
运行后输出结果与预期一致:
date x y 0 True True True 1 False False False 2 False False False
内容的提问来源于stack exchange,提问作者Ikshwaku Baruah
相关产品推荐
相关产品推荐

