1

使用 Julia,有没有办法逐个单元格比较 2 个 DataFrames 和输出差异

例如: 在此处输入图像描述

预期结果将产生真/假数据框 在此处输入图像描述

提前感谢您的帮助

4

2 回答 2

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),它们如何处理这种情况。

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

于 2020-06-26T07:35:41.043 回答
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    │
于 2020-06-26T06:48:22.950 回答