Python 将两个数据帧的列与索引和行值的组合进行比较

Python 将两个数据帧的列与索引和行值的组合进行比较,python,pandas,Python,Pandas,有很多类似的问题,但我不确定是否有一个同时处理索引和行值的问题。(与二进制分类df相关) 所以我要做的是比较具有相同名称的列,使它们具有相同的值和索引。如果不是,只需返回一个错误 假设数据帧df有a、b和c列,df\u原始有a到z列 我们如何首先在这两个数据帧之间找到具有相同名称的列,然后检查这些列的内容,使它们在a、b和c之间的值和索引中逐行匹配df和df\u-original 所有列的内容都是数字的,这就是为什么我要比较索引和值的组合 演示: 在上面的示例中,对于具有相同列名的列,比较索引和

有很多类似的问题,但我不确定是否有一个同时处理索引和行值的问题。(与二进制分类df相关)

所以我要做的是比较具有相同名称的列,使它们具有相同的值和索引。如果不是,只需返回一个错误

假设数据帧
df
a
b
c
列,
df\u原始
a
z

我们如何首先在这两个数据帧之间找到具有相同名称的列,然后检查这些列的内容,使它们在
a
b
c
之间的值和索引中逐行匹配
df
df\u-original

所有列的内容都是数字的,这就是为什么我要比较索引和值的组合

演示:

在上面的示例中,对于具有相同列名的列,比较索引和值的组合,如果索引和值的组合不正确,则标记错误

common_cols = df.columns.intersection(df_original.columns)

for col in common_cols:

    df1_ind_val_pair = df[col].index.astype(str) + ' ' + df[col].astype(str)
    df2_ind_val_pair = df_original[col].index.astype(str) + ' ' + df_original[col].astype(str)

    if any(df1_ind_val_pair != df2_ind_val_pair):
        print('Found one or more unequal (index, value) pairs in col {}'.format(col))
internal
的联接方法一起使用。然后将结果
元组
解包传递给
pd.DataFrame.eq

pd.DataFrame.eq(*df.align(dfo, 'inner'))

       a      b      c
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False
4  False  False   True
要查看包含所有列的行
True
,请使用此掩码进行筛选:

pd.DataFrame.eq(*df.align(dfo, 'inner')).all(1)

0    False
1    False
2    False
3    False
4    False
dtype: bool
但是,对于示例数据,结果将为空

df[pd.DataFrame.eq(*df.align(dfo, 'inner')).all(1)]

Empty DataFrame
Columns: [a, b, c]
Index: []

答案相同,但代码更清晰

def eq(d1, d2):
    d1, d2 = d1.align(d2, 'inner')
    return d1 == d2

eq(df, dfo)

       a      b      c
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False
4  False  False   True

请提供一些数据以便更好地理解。请创建一个最小、完整且可验证的示例-@ShivamGaur请检查示例输出?在没有匹配项的情况下,只使用带有“Error”的df?您的索引是否总是连续的,从0开始?这看起来很好,但我认为与其按索引和值进行比较,不如同时比较索引和值,因为在比较两者的组合时,您希望对每列比较(索引,值)从
df
df_original
的(索引,值)对,如果有一对不相等,则打印列名,对吗?难以置信!感谢索引的行为类似于有序集,因此它们也在集合上定义了大多数方法。您可以使用
df.columns.intersection
是的,这也可以,但是对于一个巨大的表5mil x 5mil,几乎不可能检查所有内容。它能打印出那些不相等的位置吗?当然,我不能想象你真的想打印每一个失败。但我们还是可以。你到底想做什么?你在记录这些吗?您想要顺序位置(索引和列)还是标签?你可以通过显示你期望的输出来清除这个问题。如果有假或者没有假,它只会打印出来。其实不是每一个。但如果有的话
def eq(d1, d2):
    d1, d2 = d1.align(d2, 'inner')
    return d1 == d2

eq(df, dfo)

       a      b      c
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False
4  False  False   True