python - Pandas 数据框相等性测试
问题描述
只要两个数据帧中的行相等,我如何编写一个检查两个输入数据帧是否相等的函数?所以它忽略了索引位置和列顺序。我不能使用 df.equals() 因为它会强制数据类型相等,这不是我需要的。
from io import StringIO
canonical_in_csv = """,c,a,b
2,hat,x,1
0,rat,y,4
3,cat,x,2
1,bat,x,2"""
with StringIO(canonical_in_csv) as fp:
df1 = pd.read_csv(fp, index_col=0)
canonical_soln_csv = """,a,b,c
0,x,1,hat
1,x,2,bat
2,x,2,cat
3,y,4,rat"""
with StringIO(canonical_soln_csv) as fp:
df2 = pd.read_csv(fp, index_col=0)
df1:
c a b
2 hat x 1
0 rat y 4
3 cat x 2
1 bat x 2
df2:
a b c
0 x 1 hat
1 x 2 bat
2 x 2 cat
3 y 4 rat
我的尝试:
temp1 = (df == df2).all()
temp2 = temp1.all()
temp2
ValueError:只能比较标记相同的 DataFrame 对象
解决方案
您可以sort_index
先使用按索引和列值,然后merge
使用eq
( ==
) 或equals
:
df11 = df1.sort_index().sort_index(axis=1)
df22 = df2.sort_index().sort_index(axis=1)
print (df11.merge(df22))
a b c
0 y 4 rat
1 x 2 bat
2 x 1 hat
3 x 2 cat
print (df11.merge(df22).eq(df11))
a b c
0 True True True
1 True True True
2 True True True
3 True True True
a = df11.merge(df22).eq(df11).values.all()
#alternative
#a = df11.merge(df22).equals(df11)
print (a)
True
你的函数应该被重写:
def checkequality(A, B):
df11 = A.sort_index(axis=1)
df11 = df11.sort_values(df11.columns.tolist()).reset_index(drop=True)
df22 = B.sort_index(axis=1)
df22 = df22.sort_values(df22.columns.tolist()).reset_index(drop=True)
return (df11 == df22).values.all()
a = checkequality(df1, df2)
print (a)
True
推荐阅读
- scala - 在 Spark 2 中创建垂直表
- sql - 1对多关系表连接SQL
- templates - 具有混合引用和非引用类型的可变参数模板
- android - 无活动启动服务
- javascript - 在IONIC中使用cordova-plugin-geolocation打开地理定位
- html - 固定引导内容
- data-structures - 单独的链散列有序与无序
- sql-server - 无法将本机 SQL Server .bak 文件还原到 AWS RDS SQL Server
- python - 如何使用 Python 多处理并行化它?
- google-app-engine - 谷歌云引擎中的python flask-restful部署