使用 Julia,有没有办法逐个单元格比较 2 个 DataFrames 和输出差异
提前感谢您的帮助
AbstractDataFrame
对象支持广播,所以你可以写:
julia> df1 .== df2
3×2 DataFrame
│ Row │ Col1 │ Col2 │
│ │ Bool │ Bool │
├─────┼──────┼──────┤
│ 1 │ 1 │ 1 │
│ 2 │ 1 │ 1 │
│ 3 │ 0 │ 1 │
或者
julia> isequal.(df1, df2)
3×2 DataFrame
│ Row │ Col1 │ Col2 │
│ │ Bool │ Bool │
├─────┼──────┼──────┤
│ 1 │ 1 │ 1 │
│ 2 │ 1 │ 1 │
│ 3 │ 0 │ 1 │
==
和之间的区别在于isequal
如果您missing
在单元格中有值(==
将missing
在这种情况下产生并isequal
产生true
/ false
),它们如何处理这种情况。
使用Matrix
Przemyslaw 建议的方法将忽略列名(并且通常会很昂贵,因为它执行数据复制)。Przemyslaw 提出的第二个选项忽略了数据框中的列顺序(在某些情况下,您实际上可能需要它)并且不检查两个数据框中的列名集是否相同。
基本上你需要以.==
多种方式之一使用。
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"
如果你想要一个DataFrame
:
julia> DataFrame((n => df1[!,n] .== df2[!,n] for n in names(df2))...)
3×2 DataFrame
│ Row │ Col1 │ Col2 │
│ │ Bool │ Bool │
├─────┼──────┼──────┤
│ 1 │ 1 │ 1 │
│ 2 │ 1 │ 1 │
│ 3 │ 0 │ 1 │