Skip to content

Commit 63bd85a

Browse files
authored
add haskey and get support for DataFrameColumns (#3282)
1 parent 3368d85 commit 63bd85a

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
* Add `keep` keyword argument to `nonunique`, `unique`, and `unique!`
2424
allowing to specify which duplicate rows should be kept
2525
([#3260](https://github.com/JuliaData/DataFrames.jl/pull/3260))
26+
* Add `haskey` and `get` methods to `DataFrameColumns`
27+
to make it support dictionary interface more completely
28+
([#3282](https://github.com/JuliaData/DataFrames.jl/pull/3282))
2629

2730
## Bug fixes
2831

src/abstractdataframe/iteration.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,14 @@ with the corresponding column vector, i.e. `name => col`
240240
where `name` is the column name of the column `col`.
241241
"""
242242
Base.pairs(itr::DataFrameColumns) = Base.Iterators.Pairs(itr, keys(itr))
243+
244+
Base.haskey(itr::DataFrameColumns, col::Union{AbstractString, Symbol}) =
245+
columnindex(parent(itr), col) > 0
246+
Base.haskey(itr::DataFrameColumns, col::Union{Signed, Unsigned}) =
247+
0 < col <= ncol(parent(itr))
248+
Base.get(itr::DataFrameColumns, col::ColumnIndex, default) =
249+
haskey(itr, col) ? itr[col] : default
250+
243251
Base.findnext(f::Function, itr::DataFrameColumns, i::Integer) =
244252
findnext(f, values(itr), i)
245253
Base.findnext(f::Function, itr::DataFrameColumns, i::Union{Symbol, AbstractString}) =

test/iteration.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,39 @@ end
247247
@test parent(er3) isa SubDataFrame
248248
@test parentindices(parent(er3))[1] == 1:2
249249
end
250+
251+
end
252+
253+
@testset "haskey and get for DataFrameColumns" begin
254+
df_ref = DataFrame(a=1:3, b=2:4, c=3:5)
255+
for df in (df_ref, @view df_ref[1:3, 1:2])
256+
dfc = eachcol(df)
257+
@test !haskey(dfc, 0)
258+
@test haskey(dfc, 1)
259+
@test haskey(dfc, 2)
260+
@test !haskey(dfc, 4)
261+
@test !haskey(dfc, 0x0)
262+
@test haskey(dfc, 0x1)
263+
@test !haskey(dfc, :x)
264+
@test !haskey(dfc, "x")
265+
@test !haskey(dfc, Test.GenericString("x"))
266+
@test haskey(dfc, :a)
267+
@test haskey(dfc, "a")
268+
@test haskey(dfc, Test.GenericString("a"))
269+
270+
@test get(dfc, 0, "error") == "error"
271+
@test get(dfc, 1, "error") == 1:3
272+
@test get(dfc, 4, "error") == "error"
273+
@test get(dfc, 0x0, "error") == "error"
274+
@test get(dfc, 0x1, "error") == 1:3
275+
@test get(dfc, :x, "error") == "error"
276+
@test get(dfc, "x", "error") == "error"
277+
@test get(dfc, Test.GenericString("x"), "error") == "error"
278+
@test get(dfc, :a, "error") == 1:3
279+
@test get(dfc, "a", "error") == 1:3
280+
@test get(dfc, Test.GenericString("a"), "error") == 1:3
281+
@test_throws MethodError get(dfc, "a")
282+
end
250283
end
251284

252285
end # module

0 commit comments

Comments
 (0)