# CSV.Write DataFrame boolean columns as 0 or 1, not as string: "false" and "true"

**URL:** <https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449>\
**Category:** General Usage\
**Tags:** dataframes\
**Created:** [January 16, 2020, 6:37pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449 "2020-01-16T18:37:12Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![BMval](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmval/32/7647_2.png) [@BMval](https://discourse.julialang.org/u/BMval)\
**Post date:** [January 16, 2020, 6:37pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/1 "2020-01-16T18:37:12Z")

</div>

When I save a DataFrame with boolean columns, CSV.write them as strings: “false” and “true”, so it increases file sizes.

How to save the boolean columns into 0 and 1.

Thank you in advance.

---

<div class="post-metadata">

**Author:** ![vlandau](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vlandau/32/8986_2.png) [@vlandau](https://discourse.julialang.org/u/vlandau)\
**Post date:** [January 16, 2020, 7:15pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/2 "2020-01-16T19:15:59Z")

</div>

Would using something like `Int8.()` before writing the csv work?

---

<div class="post-metadata">

**Author:** ![BMval](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmval/32/7647_2.png) [@BMval](https://discourse.julialang.org/u/BMval)\
**Post date:** [January 16, 2020, 7:21pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/3 "2020-01-16T19:21:22Z")

</div>

I try to convert

> df[:,:ART]= Int8.(df[:,:ART])

But for some reasons, it doesn’t help =((

---

<div class="post-metadata">

**Author:** ![BMval](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmval/32/7647_2.png) [@BMval](https://discourse.julialang.org/u/BMval)\
**Post date:** [January 16, 2020, 7:24pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/4 "2020-01-16T19:24:39Z")

</div>

I can’t covert bool to int =((

> dff=DataFrame(id=[1,2,3],b=[true,false,true])  
> dff[:,:b]=Int8.(dff[:,:b])  
> typeof(dff.b)

---

<div class="post-metadata">

**Author:** ![curtd](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/curtd/32/15868_2.png) [@curtd](https://discourse.julialang.org/u/curtd)\
**Post date:** [January 16, 2020, 7:32pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/5 "2020-01-16T19:32:23Z")

</div>

If you don’t mind changing some internal CSV behaviour in your module, you can use

```julia
CSV.writecell(buf,pos,len,io, x::Bool, opts) = CSV.writecell(buf,pos,len,io, x ? "1" : "0",opts)

```

---

<div class="post-metadata">

**Author:** ![BMval](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmval/32/7647_2.png) [@BMval](https://discourse.julialang.org/u/BMval)\
**Post date:** [January 16, 2020, 7:35pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/6 "2020-01-16T19:35:59Z")

</div>

Thank you. It works, even I don’t think it is the best, but I will use it.

---

<div class="post-metadata">

**Author:** ![vlandau](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vlandau/32/8986_2.png) [@vlandau](https://discourse.julialang.org/u/vlandau)\
**Post date:** [January 16, 2020, 7:50pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/7 "2020-01-16T19:50:42Z")

</div>

If you do `dff.b = Int8.(dff.b)` instead, I think it will work. The difference must be that this is overwriting the entire column (which changes the type), but you were just overwriting the values with `dff[:,:b]=Int8.(dff[:,:b])`, which left the type as is.

Anyway, let me know if it works.

---

<div class="post-metadata">

**Author:** ![BMval](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bmval/32/7647_2.png) [@BMval](https://discourse.julialang.org/u/BMval)\
**Post date:** [January 16, 2020, 8:22pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/8 "2020-01-16T20:22:11Z")

</div>

yes, you are right

---

<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:** [January 16, 2020, 9:06pm UTC](https://discourse.julialang.org/t/csv-write-dataframe-boolean-columns-as-0-or-1-not-as-string-false-and-true/33449/9 "2020-01-16T21:06:23Z")

</div>

> [@vlandau](#):
>
> dff.b = Int8.(dff.b)

is alternatively written as `dff[!, :b] = Int8.(dff.b)`. Using `:` instead of `!` means that you request an in-place operation while `!` indicates that you want to replace the old vector with a new one.
