티스토리 뷰

10_transforms(한글)

Introduction to DataFrames

Bogumił Kamiński, Apr 21, 2018

출처

함께보기

In [1]:
using DataFrames # load package

분할-적용-결합 (Split-apply-combine)

In [2]:
x = DataFrame(id=[1,2,3,4,1,2,3,4], id2=[1,2,1,2,1,2,1,2], v=rand(8))
Out[2]:
idid2v
Int64Int64Float64
1110.853822
2220.428594
3310.784733
4420.702739
5110.624787
6220.43275
7310.724575
8420.393803
In [3]:
gx1 = groupby(x, :id)
Out[3]:
GroupedDataFrame with 4 groups based on key: :id
First Group: 2 rows
│ Row │ id    │ id2   │ v        │
│     │ Int64Int64Float64  │
├─────┼───────┼───────┼──────────┤
│ 1   │ 1     │ 1     │ 0.853822 │
│ 2   │ 1     │ 1     │ 0.624787 │
⋮
Last Group: 2 rows
│ Row │ id    │ id2   │ v        │
│     │ Int64Int64Float64  │
├─────┼───────┼───────┼──────────┤
│ 1   │ 4     │ 2     │ 0.702739 │
│ 2   │ 4     │ 2     │ 0.393803 │
In [4]:
gx2 = groupby(x, [:id, :id2])
Out[4]:
GroupedDataFrame with 4 groups based on keys: :id, :id2
First Group: 2 rows
│ Row │ id    │ id2   │ v        │
│     │ Int64Int64Float64  │
├─────┼───────┼───────┼──────────┤
│ 1   │ 1     │ 1     │ 0.853822 │
│ 2   │ 1     │ 1     │ 0.624787 │
⋮
Last Group: 2 rows
│ Row │ id    │ id2   │ v        │
│     │ Int64Int64Float64  │
├─────┼───────┼───────┼──────────┤
│ 1   │ 4     │ 2     │ 0.702739 │
│ 2   │ 4     │ 2     │ 0.393803 │
In [5]:
vcat(gx2...) # 원래의 데이터프레임으로.
Out[5]:
idid2v
Int64Int64Float64
1110.853822
2110.624787
3220.428594
4220.43275
5310.784733
6310.724575
7420.702739
8420.393803
In [6]:
x = DataFrame(id = [missing, 5, 1, 3, missing], x = 1:5)
Out[6]:
idx
Int64⍰Int64
1missing1
252
313
434
5missing5
In [7]:
show(groupby(x, :id), allgroups=true) # 기본적으로 그룹은 결측(missing)도 포함하고, 정렬되지 않는다.
GroupedDataFrame with 4 groups based on key: :id
Group 1: 2 rows
│ Row │ id      │ x     │
│     │ Int64⍰Int64 │
├─────┼─────────┼───────┤
│ 1   │ missing │ 1     │
│ 2   │ missing │ 5     │
Group 2: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 5      │ 2     │
Group 3: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 1      │ 3     │
Group 4: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 3      │ 4     │
In [8]:
show(groupby(x, :id, sort=true, skipmissing=true), allgroups=true) # 하지만 바꿀 수 있다.
GroupedDataFrame with 3 groups based on key: :id
Group 1: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 1      │ 3     │
Group 2: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 3      │ 4     │
Group 3: 1 row
│ Row │ id     │ x     │
│     │ Int64⍰Int64 │
├─────┼────────┼───────┤
│ 1   │ 5      │ 2     │
In [9]:
x = DataFrame(id=rand('a':'d', 100), v=rand(100));
using Statistics
by(x, :id, y->mean(y[:v])) # 각각의 그룹에 대해서 함수를 적용할 수 있다.
Out[9]:
idx1
CharFloat64
1'c'0.506402
2'b'0.495104
3'a'0.447717
4'd'0.477769
In [10]:
by(x, :id, y->mean(y[:v]), sort=true) # 결과를 정렬할 수 있다.
Out[10]:
idx1
CharFloat64
1'a'0.447717
2'b'0.495104
3'c'0.506402
4'd'0.477769
In [11]:
by(x, :id, y->DataFrame(res=mean(y[:v]))) # 이 방법으로 열 이름을 바꿀 수 있다.
Out[11]:
idres
CharFloat64
1'c'0.506402
2'b'0.495104
3'a'0.447717
4'd'0.477769
In [12]:
x = DataFrame(id=rand('a':'d', 100), x1=rand(100), x2=rand(100))
aggregate(x, :id, sum) # 모든 열에 대해서 :id별로 함수를 적용한다.
Out[12]:
idx1_sumx2_sum
CharFloat64Float64
1'b'9.6851910.1587
2'c'14.410515.8606
3'a'8.010086.03163
4'd'15.954413.8985
In [13]:
aggregate(x, :id, sum, sort=true) # 이 또한 정렬할 수 있다.
Out[13]:
idx1_sumx2_sum
CharFloat64Float64
1'a'8.010086.03163
2'b'9.6851910.1587
3'c'14.410515.8606
4'd'15.954413.8985

원문의 저자가 map과 combine은 유용한지 잘 모르겠어서 크게 언급하지 않기로 했다고 한다. (by가 더 낫다고 한다.)

In [14]:
x = DataFrame(rand(3, 5))
Out[14]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.4924890.7809190.8838630.9291360.582756
20.2849360.5264680.7268110.8481880.245438
30.6175820.2235290.332230.5119160.00244369
In [15]:
map(mean, eachcol(x)) # 각 열에 대해서 함수를 매핑하고 결과를 데이터프레임으로 받는다.
Out[15]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.4650020.5103060.6476350.763080.276879
In [16]:
foreach(c -> println(c[1], ": ", mean(c[2])), eachcol(x)) # 반복을 이용해서 열 이름과 계산 값을 튜플로 받는다.
x1: 0.4650023050024165
x2: 0.5103055011163233
x3: 0.6476346358419589
x4: 0.7630800031479401
x5: 0.27687920249388487
In [17]:
colwise(mean, x) # 열별로 하는 것은 비슷하나, 결과를 벡터로 받는다.
Out[17]:
5-element Array{Float64,1}:
 0.4650023050024165 
 0.5103055011163233 
 0.6476346358419589 
 0.7630800031479401 
 0.27687920249388487
In [18]:
x[:id] = [1,1,2]
colwise(mean,groupby(x, :id)) # 그룹화된 데이터프레임 (GroupedDataFrame)으로 작업한다.
Out[18]:
2-element Array{Array{Float64,1},1}:
 [0.388712, 0.653694, 0.805337, 0.888662, 0.414097, 1.0] 
 [0.617582, 0.223529, 0.33223, 0.511916, 0.00244369, 2.0]
In [19]:
map(r -> r[:x1]/r[:x2], eachrow(x)) # 이번에는 데이터프레임의 행별로 함수를 적용한다.
Out[19]:
3-element Array{Float64,1}:
 0.6306527976520862
 0.5412219085291118
 2.7628664958717355

'Flux in Julia > Learning Julia (Intro_to_Julia_DFs)' 카테고리의 다른 글

11. performance (한글)  (0) 2018.10.18
11. performance  (0) 2018.10.18
10. transforms  (0) 2018.10.16
09. reshaping(한글)  (0) 2018.10.15
09. reshaping  (0) 2018.10.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함