# Creating Adjacency matrix from a DataFrame

**URL:** https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395
**Category:** General Usage
**Tags:** question, dataframes, data\_structures
**Created:** [March 21, 2023, 2:40pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395 "2023-03-21T14:40:36Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![le\_ackerman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/le_ackerman/32/38731_2.png) [@le\_ackerman](https://discourse.julialang.org/u/le_ackerman)
#### Post date: [March 21, 2023, 2:40pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/1 "2023-03-21T14:40:36Z")

</div>

I want to create an adjacency matrix with first two columns of a dataframe and the weights will be taken from the 3rd column.  
for reference, say the dataframe looks like:

```julia
index Name_A Name_B
  0 Adam Ben
  1 Chris David
  2 Adam Chris
  3 Ben Chris

```

and I’ll like to obtain the adjacency matrix

```julia
      Adam Ben Chris David
Adam 0 1 1 0
Ben 0 0 1 0
Chris 0 0 0 1
David 0 0 0 0

```

here the weights are random.  
It can be done in python easily but is there a better way to do it in julia?

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [March 21, 2023, 3:23pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/2 "2023-03-21T15:23:43Z")

</div>

```julia
nA=["adam", "chris", "adam", "ben"] #(=df.name_A)
nB=["ben", "david", "chris", "chris"] #(=df.name_B)

n=sort(union(nA,nB))
[e in nA.*nB for e in n.*reshape(n,1,:)]

```

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [March 21, 2023, 3:37pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/3 "2023-03-21T15:37:08Z")

</div>

```julia

n=sort(union(nA,nB))
xnA=indexin(nA,n)
xnB=indexin(nB,n)
using SparseArrays
ad=sparse(xnA,xnB,fill(1,length(n)))

```

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [March 21, 2023, 3:43pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/4 "2023-03-21T15:43:56Z")

</div>

```julia

n=sort(union(nA,nB))
xnA=indexin(nA,n)
xnB=indexin(nB,n)
sz=length(n)
ad=fill(0, sz,sz)
ad[CartesianIndex.(zip(xnA,xnB))].=1

```

---

<div class="post-metadata">

### Author: ![le\_ackerman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/le_ackerman/32/38731_2.png) [@le\_ackerman](https://discourse.julialang.org/u/le_ackerman)
#### Post date: [March 21, 2023, 5:05pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/5 "2023-03-21T17:05:17Z")

</div>

Thanks for the reply, but let say i have weights in another column  
how can i add weights in it?

---

<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: [March 21, 2023, 5:18pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/6 "2023-03-21T17:18:05Z")

</div>

I would use [GitHub - JuliaGraphs/SimpleWeightedGraphs.jl: Edge-weighted graphs compatible with Graphs.jl](https://github.com/JuliaGraphs/SimpleWeightedGraphs.jl) for this.

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [March 21, 2023, 5:24pm UTC](https://discourse.julialang.org/t/creating-adjacency-matrix-from-a-dataframe/96395/7 "2023-03-21T17:24:55Z")

</div>

> [@le\_ackerman](#):
>
> how can i add weights in it?

could you elaborate this? may be showing an example

is this perhaps?

```julia
julia> df=DataFrame(;index,nA,nB,w)
4×4 DataFrame
 Row │ index nA nB w
     │ Int64 String String Float64
─────┼──────────────────────────────────
   1 │ 0 adam ben 0.137223
   2 │ 1 chris david 0.0460983
   3 │ 2 adam chris 0.967263
   4 │ 3 ben chris 0.42919

julia> n=sort(union(nA,nB))
4-element Vector{String}:
 "adam"
 "ben"
 "chris"
 "david"

julia> sz=length(n)
4

julia> ad=fill(0., sz,sz)
4×4 Matrix{Float64}:
 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0
 0.0 0.0 0.0 0.0

julia> ad[CartesianIndex.(zip(xnA,xnB))]=w
4-element Vector{Float64}:
 0.13722275200211942
 0.04609834073111019
 0.9672631957847251
 0.4291902000590766

julia> ad
4×4 Matrix{Float64}:
 0.0 0.137223 0.967263 0.0
 0.0 0.0 0.42919 0.0
 0.0 0.0 0.0 0.0460983
 0.0 0.0 0.0 0.0

```

```julia
using DataFrames
index=0:3
nA=["adam", "chris", "adam", "ben"]
nB=["ben", "david", "chris", "chris"]
w=rand(4)
df=DataFrame(;index,nA,nB,w)

dfe=vcat(df,DataFrame(;nA="david"),DataFrame(;nB="adam"), cols=:union)

udf=unstack(dfe, :nA,:nB,:w, allowmissing=true, fill=0)

sort!(udf,:nA)

select(udf, ["nA"; sort(names(udf)[2:end])])[1:end-1,1:end-1]

4×5 DataFrame
 Row │ nA adam ben chris david    
     │ String? Float64? Float64? Float64? Float64?
─────┼─────────────────────────────────────────────────
   1 │ adam 0.0 0.354848 0.90648 0.0
   2 │ ben 0.0 0.0 0.118272 0.0
   3 │ chris 0.0 0.0 0.0 0.708691
   4 │ david 0.0 0.0 0.0 0.0

```
