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

时间:2020-06-26 04:46:20

标签: dataframe julia ijulia-notebook julia-studio julia-gpu

使用Julia,有没有一种方法可以逐个比较两个DataFrame和输出差异

例如: enter image description here

预期结果将产生具有True / False的数据帧 enter image description here

预先感谢您的帮助

2 个答案:

答案 0 :(得分:3)

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

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    │

答案 1 :(得分:3)

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)。

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