# If-else applied to a DataFrame

**URL:** <https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238>\
**Category:** New to Julia\
**Created:** [August 20, 2020, 4:15am UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238 "2020-08-20T04:15:31Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![kabir\_sud](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kabir_sud/32/17331_2.png) [@kabir\_sud](https://discourse.julialang.org/u/kabir_sud)\
**Post date:** [August 20, 2020, 4:15am UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/1 "2020-08-20T04:15:31Z")

</div>

How can the IF ELSE loop be applied to a data frame.  
I want the loop to take the first 2 columns as conditions and give me an output in the final.

For eg: if “col A” == 4 && “col B” == 2  
print(“Yes”)  
else  
print(“no”)

---

<div class="post-metadata">

**Author:** ![xiaodai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xiaodai/32/15937_2.png) [@xiaodai](https://discourse.julialang.org/u/xiaodai)\
**Post date:** [August 20, 2020, 4:31am UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/2 "2020-08-20T04:31:17Z")

</div>

Please check this out.

> [@Please read: make it easier to help you](https://discourse.julialang.org/t/psa-make-it-easier-to-help-you/14757):
>
> Welcome to the Julia Discourse! We are enthusiastic about helping Julia programmers, both beginner and experienced. This public service announcement (PSA) outlines best practices when asking for help. Following these points makes it easier for us to help you and more likely you’ll get a prompt, useful answer. Keywords are highlighted to make it easier to refer to specific points. Choose a descriptive title that captures the key part of your question, eg “plots with multiple axes” instead of …

---

<div class="post-metadata">

**Author:** ![nilshg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nilshg/32/2283_2.png) [@nilshg](https://discourse.julialang.org/u/nilshg)\
**Post date:** [August 20, 2020, 6:34am UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/3 "2020-08-20T06:34:01Z")

</div>

A column of a dataframe is just a vector, so

```julia
for (a, b) in zip(df.A, df.B)
    (a==4) & (b==2) ? print("Yes") : print("No")
end

```

---

<div class="post-metadata">

**Author:** ![lungben](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lungben/32/12314_2.png) [@lungben](https://discourse.julialang.org/u/lungben)\
**Post date:** [August 20, 2020, 7:08am UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/4 "2020-08-20T07:08:01Z")

</div>

Or using broadcasting:

```julia
f(a,b) = (a==4) & (b==2) ? "Yes" : "No"
res = f.(df.A, df.B)
println(res)

```

---

<div class="post-metadata">

**Author:** ![derekmahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/derekmahar/32/216439_2.png) [@derekmahar](https://discourse.julialang.org/u/derekmahar)\
**Post date:** [August 20, 2020, 5:13pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/5 "2020-08-20T17:13:30Z")

</div>

> [@lungben](#):
>
> `res = f.(df.A, df.B)`

How do you interpret the function broadcast?

---

<div class="post-metadata">

**Author:** ![lungben](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lungben/32/12314_2.png) [@lungben](https://discourse.julialang.org/u/lungben)\
**Post date:** [August 20, 2020, 5:28pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/6 "2020-08-20T17:28:37Z")

</div>

`df.A` and `df.B` are Arrays with the same length. The function `f` is applied to each “row” of the dataframe separately and its output is written into the array `res`.  
Hope this answers your question!

---

<div class="post-metadata">

**Author:** ![derekmahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/derekmahar/32/216439_2.png) [@derekmahar](https://discourse.julialang.org/u/derekmahar)\
**Post date:** [August 20, 2020, 5:40pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/7 "2020-08-20T17:40:23Z")

</div>

Does `(df.A, df.B) == zip(df.A, df.B)`?

---

<div class="post-metadata">

**Author:** ![lungben](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lungben/32/12314_2.png) [@lungben](https://discourse.julialang.org/u/lungben)\
**Post date:** [August 20, 2020, 5:46pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/8 "2020-08-20T17:46:12Z")

</div>

No.  
`zip(df.A, df.B)` gives an array of (2-element) tuples, whereas `(df.A, df.B)` is a tuple of arrays.

---

<div class="post-metadata">

**Author:** ![derekmahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/derekmahar/32/216439_2.png) [@derekmahar](https://discourse.julialang.org/u/derekmahar)\
**Post date:** [August 20, 2020, 6:11pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/9 "2020-08-20T18:11:00Z")

</div>

So `f.(df.A, df.B)` applies `f` to every pair of arguments that it extracts from each row of columns `df.A` and `df.B` and returns a vector of “yes” or “no” strings?

---

<div class="post-metadata">

**Author:** ![lungben](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lungben/32/12314_2.png) [@lungben](https://discourse.julialang.org/u/lungben)\
**Post date:** [August 20, 2020, 6:22pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/10 "2020-08-20T18:22:00Z")

</div>

Correct

Example:

```julia
df = DataFrame(a=(1:10).+2, b=1:10)
f(a,b) = (a==4) & (b==2) ? "Yes" : "No"
res = f.(df.a, df.b)

```

---

<div class="post-metadata">

**Author:** ![haberdashPI](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/haberdashpi/32/26337_2.png) [@haberdashPI](https://discourse.julialang.org/u/haberdashPI)\
**Post date:** [August 20, 2020, 6:28pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/11 "2020-08-20T18:28:04Z")

</div>

A few more details: the `.` after a function is syntactic sugar. All dotted functions on a line are fused into a single function and applied element-wise to their arguments using the higher-level function `broadcast`. So

```julia
sin.(cos.(xs) .+ 1) == broadcast(x -> sin(cos(x) + 1), xs)

```

The function `broadcast` is similar to `map`, but it broadcasts singleton array dimensions, e.g.

```julia
julia> ones(10,2) .+ (1:10)
10×2 Array{Float64,2}:
  2.0 2.0
  3.0 3.0
  4.0 4.0
  5.0 5.0
  6.0 6.0
  7.0 7.0
  8.0 8.0
  9.0 9.0
 10.0 10.0
 11.0 11.0

```

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [August 20, 2020, 6:53pm UTC](https://discourse.julialang.org/t/if-else-applied-to-a-dataframe/45238/12 "2020-08-20T18:53:47Z")

</div>

Strange nobody mentioned `ifelse`.

```julia
julia> new_vector = ifelse.((df["col_A"] .== 4) .& (df["col_B"] .== 2), "Yes", "No")
julia> println(new_vector)

```
