# Number groups in dataframe

**URL:** <https://discourse.julialang.org/t/number-groups-in-dataframe/90069>\
**Category:** Data\
**Tags:** question, dataframes\
**Created:** [November 10, 2022, 8:33pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069 "2022-11-10T20:33:29Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![pascal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pascal/32/207922_2.png) [@pascal](https://discourse.julialang.org/u/pascal)\
**Post date:** [November 10, 2022, 8:33pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/1 "2022-11-10T20:33:30Z")

</div>

This is probably very each but I just cannot figure it out. Let’s say I have a dataframe

```julia
df = DataFrame(x = rand(6), g = ["c", "c", "a", "b", "b", "b"])
6×2 DataFrame
 Row │ x g      
     │ Float64 String 
─────┼───────────────────
   1 │ 0.0276903 c
   2 │ 0.164615 c
   3 │ 0.526818 a
   4 │ 0.221024 b
   5 │ 0.610872 b
   6 │ 0.754117 b

```

Additionally to column `g` I want to have a column that numbers the groups in `g`, s.t.

```julia
6×3 DataFrame
 Row │ x g gnum  
     │ Float64 String Int64 
─────┼──────────────────────────
   1 │ 0.424061 c 1
   2 │ 0.851586 c 1
   3 │ 0.537859 a 2
   4 │ 0.694742 b 3
   5 │ 0.0538259 b 3
   6 │ 0.304558 b 3

```

How can I do this (preferably within a `@chain`)?

Thanks

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [November 10, 2022, 9:04pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/2 "2022-11-10T21:04:45Z")

</div>

You want `groupindices`

```julia
julia> transform(gd, groupindices => :gnum)
6×3 DataFrame
 Row │ x g gnum  
     │ Float64 String Int64 
─────┼──────────────────────────
   1 │ 0.0980152 c 1
   2 │ 0.469093 c 1
   3 │ 0.81644 a 2
   4 │ 0.558021 b 3
   5 │ 0.218029 b 3
   6 │ 0.919571 b 3

```

---

<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:** [November 10, 2022, 9:06pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/3 "2022-11-10T21:06:53Z")

</div>

where `gd = groupby(df, :g)`

---

<div class="post-metadata">

**Author:** ![pascal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pascal/32/207922_2.png) [@pascal](https://discourse.julialang.org/u/pascal)\
**Post date:** [November 11, 2022, 7:56am UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/4 "2022-11-11T07:56:52Z")

</div>

Doing

```julia
df = DataFrame(x = rand(6), g = ["c", "c", "a", "b", "b", "b"])
gd = groupby(df, :g)
transform(gd, groupindices => :gnum)

```

results in the following error:

```julia
ERROR: ArgumentError: Unrecognized column selector: DataFrames.groupindices => :gnum

```

It works if I do

```julia
df.gnum = groupindices(groupby(df, :g))

```

Is there also a way to use `Chain.jl` e.g.

```julia
df_new = @chain df begin
    groupby(_, :g)
    @transform :gnum = groupindices(_)
end

```

Thanks!

---

<div class="post-metadata">

**Author:** ![alfaromartino](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alfaromartino/32/52986_2.png) [@alfaromartino](https://discourse.julialang.org/u/alfaromartino)\
**Post date:** [November 11, 2022, 1:29pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/5 "2022-11-11T13:29:16Z")

</div>

For using `transform(gd, groupindices => :gnum)` you need to update DataFrames to its latest version. See [here](https://bkamins.github.io/julialang/2022/11/04/minilanguage.html).

---

<div class="post-metadata">

**Author:** ![pascal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pascal/32/207922_2.png) [@pascal](https://discourse.julialang.org/u/pascal)\
**Post date:** [November 11, 2022, 2:39pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/6 "2022-11-11T14:39:20Z")

</div>

Thanks @alfaromartino, it works after the update!

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [November 11, 2022, 2:52pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/7 "2022-11-11T14:52:08Z")

</div>

Two things

1. You can use the functions with Chain.jl. Chain.jl and DataFramesMeta.jl macros are not tied together in any way.

```julia
julia> df_new = @chain df begin
           groupby(_, :g)
           transform(groupindices => :gnum)
       end
6×3 DataFrame
 Row │ x g gnum  
     │ Float64 String Int64 
─────┼──────────────────────────
   1 │ 0.465506 c 1
   2 │ 0.0945491 c 1
   3 │ 0.512721 a 2
   4 │ 0.444936 b 3
   5 │ 0.631455 b 3
   6 │ 0.667982 b 3

```

But also, you can use it with `@transform` as follows

```julia
julia> df_new = @chain df begin
           groupby(_, :g)
           @transform :gnum = $groupindices
       end
6×3 DataFrame
 Row │ x g gnum  
     │ Float64 String Int64 
─────┼──────────────────────────
   1 │ 0.465506 c 1
   2 │ 0.0945491 c 1
   3 │ 0.512721 a 2
   4 │ 0.444936 b 3
   5 │ 0.631455 b 3
   6 │ 0.667982 b 3

```

---

<div class="post-metadata">

**Author:** ![pascal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pascal/32/207922_2.png) [@pascal](https://discourse.julialang.org/u/pascal)\
**Post date:** [November 11, 2022, 3:10pm UTC](https://discourse.julialang.org/t/number-groups-in-dataframe/90069/8 "2022-11-11T15:10:25Z")

</div>

Thanks a lot @pdeffebach
