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

时间:2018-02-15 10:23:38

标签: python pandas

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

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

我们假设DataFrame a包含b列,cdf_orginal以及az到{ {1}}。

我们如何才能首先找到这两个DataFrame之间具有相同名称的列,然后检查这些列的内容,使它们在a,{{1}之间逐行匹配值和索引} b来自cdf

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

演示:

df_orginal

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

2 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:0)

IIUC:

pd.DataFrame.aligninner的联接方法一起使用。然后将生成的tuple解压缩传递给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