Dataframe 使用Julia逐单元比较2个数据帧

Dataframe 使用Julia逐单元比较2个数据帧,dataframe,julia,ijulia-notebook,julia-studio,julia-gpu,Dataframe,Julia,Ijulia Notebook,Julia Studio,Julia Gpu,使用Julia,有没有一种方法可以逐个单元格比较2个数据帧并输出差异 例如: 预期结果将生成具有True/False的数据帧 提前感谢您的帮助基本上您需要使用。==多种方法之一 using DataFrames df1 = DataFrame(Col1=["A","B","C"],Col2=["X","Y","Z"]) df2 = DataFrame(Col1=["

使用Julia,有没有一种方法可以逐个单元格比较2个数据帧并输出差异

例如:

预期结果将生成具有True/False的数据帧

提前感谢您的帮助

基本上您需要使用。==多种方法之一

using DataFrames
df1 = DataFrame(Col1=["A","B","C"],Col2=["X","Y","Z"])
df2 = DataFrame(Col1=["A","B","D"],Col2=["X","Y","Z"])
这是最短的版本:

julia> Matrix(df1) .== Matrix(df2)
3×2 BitArray{2}:
 1  1
 1  1
 0  1
在这种方法中,您可以使用维度删除[:]来获取不匹配值的列表:

julia> Matrix(df2)[:][(.!(Matrix(df1) .== Matrix(df2))[:])]
1-element Array{String,1}:
 "D"
如果需要数据帧:

基本上,您需要以多种方式之一使用

using DataFrames
df1 = DataFrame(Col1=["A","B","C"],Col2=["X","Y","Z"])
df2 = DataFrame(Col1=["A","B","D"],Col2=["X","Y","Z"])
这是最短的版本:

julia> Matrix(df1) .== Matrix(df2)
3×2 BitArray{2}:
 1  1
 1  1
 0  1
在这种方法中,您可以使用维度删除[:]来获取不匹配值的列表:

julia> Matrix(df2)[:][(.!(Matrix(df1) .== Matrix(df2))[:])]
1-element Array{String,1}:
 "D"
如果需要数据帧:

AbstractDataFrame对象支持广播,因此您只需编写:

julia> df1 .== df2
3×2 DataFrame
│ Row │ Col1 │ Col2 │
│     │ Bool │ Bool │
├─────┼──────┼──────┤
│ 1   │ 1    │ 1    │
│ 2   │ 1    │ 1    │
│ 3   │ 0    │ 1    │

==和isequal之间的区别在于,如果单元格中缺少值,它们如何处理这种情况==将在这种情况下生成missing,isequal生成true/false

使用Przemyslaw提出的矩阵方法将忽略列名,并且通常会因为执行数据复制而代价高昂。Przemyslaw提出的第二个选项忽略了数据帧中的列顺序,在某些情况下,您可能确实需要它,并且不检查两个数据帧中的列名集是否相同。

AbstractDataFrame对象支持广播,因此您可以只写:

julia> df1 .== df2
3×2 DataFrame
│ Row │ Col1 │ Col2 │
│     │ Bool │ Bool │
├─────┼──────┼──────┤
│ 1   │ 1    │ 1    │
│ 2   │ 1    │ 1    │
│ 3   │ 0    │ 1    │

==和isequal之间的区别在于,如果单元格中缺少值,它们如何处理这种情况==将在这种情况下生成missing,isequal生成true/false


使用Przemyslaw提出的矩阵方法将忽略列名,并且通常会因为执行数据复制而代价高昂。Przemyslaw提出的第二个选项忽略了数据帧中的列顺序,在某些情况下,您实际上可能需要它,并且不检查两个数据帧中的列名集是否相同。

谢谢Bogumil的解释,我不知道Julia中的列顺序这么简单,我一直在努力使用Python,特别是当两个数据帧中的列名不同时,尽管我能够使用Python实现,但它的速度非常慢。请参见选项2,只有当两个数据帧中的列名相同时,它才起作用。但是矩阵方法是有效的,即使列名是不同的-但是,在你的期望输出规范中,你提供了一个带有列名的绘图,所以我假设你想保留它们。谢谢你Bogumil的解释,我不知道在Julia中这么容易,我一直在努力使用Python,特别是当两个数据帧中的列名不同时,尽管我能够使用Python实现,但它的速度非常慢。请参见选项2,只有当两个数据帧中的列名相同时,它才起作用。但是矩阵方法是有效的,即使列名是不同的-然而,在您所需输出的规范中,您提供了带有列名的绘图,因此我假设您希望保留列名。谢谢您的解决方案,我使用选项2。是否有一种方法可以输出至少一个未匹配的值,即类似于DataFram1的Col1=C,但DataFrame2的Col1=D位于第3行谢谢你的回答,我正在使用选项2。是否有一种方法可以输出至少一个未匹配的值,即类似DataFram1的第3行有Col1=C,但DataFrame2的第3行有Col1=D