# Replace missing values with .= in DataFrame

**URL:** <https://discourse.julialang.org/t/replace-missing-values-with-in-dataframe/8039>\
**Category:** Data\
**Tags:** question\
**Created:** [December 28, 2017, 10:36am UTC](https://discourse.julialang.org/t/replace-missing-values-with-in-dataframe/8039 "2017-12-28T10:36:32Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [December 28, 2017, 10:36am UTC](https://discourse.julialang.org/t/replace-missing-values-with-in-dataframe/8039/1 "2017-12-28T10:36:32Z")

</div>

The following is an MWE of a problem in which I wanted to replace some missing values for a specific set of observations in a `DataFrame`. It works with `=`, but not with the `.=`.

Is this a bug? If not, can someone please clarify what is going on?

```julia
using DataFrames, Missings
df = DataFrame(wage = [0.0, missing, 10.0, 20.0])
df[ismissing.(df[:wage]), :wage] .= 0 # note the . before the =
find(ismissing, df[:wage]) # 2, still there

```

Cf with arrays, `.=` works fine:

```julia
A = [0.0, missing, 10.0, 20.0]
A[ismissing.(A)] .= 0
A # OK

```

Versions:

```julia
julia> Pkg.status.(["DataFrames", "Missings"]);
 - DataFrames 0.11.3
 - Missings 0.2.4

julia> VERSION
v"0.6.2"

```

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [December 28, 2017, 3:20pm UTC](https://discourse.julialang.org/t/replace-missing-values-with-in-dataframe/8039/2 "2017-12-28T15:20:53Z")

</div>

The reason is that on 0.6.2 for arrays `.=` calls `dotview` in broadcast.jl, which creates a `view` of LHS if it is an `AbstractArray` in your case. These is no such rule for `DataFrame`.

This can be fixed by adding a definition:

```julia
import Base.Broadcast.dotview
Base.@propagate_inbounds dotview(df::DataFrame, row, col::Union{Real,Symbol}) = view(df[col], row)

```

Note that this is a solution for 0.6.2 as in 0.7 the implementation of `.=` has changed.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [December 28, 2017, 3:37pm UTC](https://discourse.julialang.org/t/replace-missing-values-with-in-dataframe/8039/3 "2017-12-28T15:37:35Z")

</div>

As an additional comment you can write:

```julia
df[ismissing.(df[:wage]), :wage] = 0

```

to get what you want (but I understand this was not your question).
