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