有很多类似的问题,但我不确定是否有一个解决索引和行值。 (与二进制分类df相关)
所以我要做的是比较具有相同名称的列以具有相同的值和索引。如果没有,只需返回错误。
我们假设DataFrame a
包含b
列,c
和df_orginal
以及a
列z
到{ {1}}。
我们如何才能首先找到这两个DataFrame之间具有相同名称的列,然后检查这些列的内容,使它们在a
,{{1}之间逐行匹配值和索引} b
来自c
和df
所有列的内容都是数字,这就是为什么我要比较索引和值的组合
演示:
df_orginal
在上面的示例中,对于那些具有相同列名的列,比较索引和值的组合,如果索引和值的组合不正确则标记错误
答案 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.align
与inner
的联接方法一起使用。然后将生成的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