티스토리 뷰
Introduction to DataFrames¶
Bogumił Kamiński, May 13, 2018
출처¶
함께보기¶
- https://deepstat.tistory.com/69 (01. constructors)(in English)
- https://deepstat.tistory.com/70 (01. constructors)(한글)
- https://deepstat.tistory.com/71 (02. basicinfo)(in English)
- https://deepstat.tistory.com/72 (02. basicinfo)(한글)
- https://deepstat.tistory.com/73 (03. missingvalues)(in English)
- https://deepstat.tistory.com/74 (03. missingvalues)(한글)
- https://deepstat.tistory.com/75 (04. loadsave)(in English)
- https://deepstat.tistory.com/76 (04. loadsave)(한글)
- https://deepstat.tistory.com/77 (05. columns)(in English)
- https://deepstat.tistory.com/78 (05. columns)(한글)
- https://deepstat.tistory.com/79 (06. rows)(in English)
- https://deepstat.tistory.com/80 (06. rows)(한글)
- https://deepstat.tistory.com/81 (07. factors)(in English)
- https://deepstat.tistory.com/82 (07. factors)(한글)
- https://deepstat.tistory.com/83 (08. joins)(in English)
- https://deepstat.tistory.com/84 (08. joins)(한글)
- https://deepstat.tistory.com/85 (09. reshaping)(in English)
- https://deepstat.tistory.com/86 (09. reshaping)(한글)
- https://deepstat.tistory.com/87 (10. transforms)(in English)
- https://deepstat.tistory.com/88 (10. transforms)(한글)
- https://deepstat.tistory.com/89 (11. performance)(in English)
- https://deepstat.tistory.com/90 (11. performance)(한글)
- https://deepstat.tistory.com/91 (12. pitfalls)(in English)
- https://deepstat.tistory.com/92 (12. pitfalls)(한글)
- https://deepstat.tistory.com/93 (13. extras)(in English)
- https://deepstat.tistory.com/94 (13. extras)(한글)
In [1]:
using DataFrames
using Statistics
추가 - 선택된 패키지의 선택된 기능¶
FreqTables: 빈도표 작성 (creating cross tabulations)¶
In [2]:
using FreqTables
df = DataFrame(a=rand('a':'d', 1000), b=rand(["x", "y", "z"], 1000))
ft = freqtable(df, :a, :b) # 가능하면 정렬되는 것을 볼 수 있다.
Out[2]:
In [3]:
ft[1,1], ft['b', "z"] # 숫자나 이름을 이용해서 결과의 일부를 불러올 수 있다.
Out[3]:
In [4]:
prop(ft, 1) # 비율을 얻을 수 있다. 1이 의미하는 것은 행별로 계산하고 싶다는 것이다.
Out[4]:
In [5]:
prop(ft, 2) # 열별로 계산됐다.
Out[5]:
In [6]:
x = categorical(rand(1:3, 10))
levels!(x, [3, 1, 2, 4]) # 레벨(level)을 재정렬하거나 새로운 레벨을 추가.
freqtable(x) # levels! 에서 정한 순서대로 나오고, 0개인 레벨도 나온다.
Out[6]:
In [7]:
freqtable([1,1,2,3,missing]) # 결측(missing)이 기본적으로 나온다.
Out[7]:
In [8]:
freqtable([1,1,2,3,missing], skipmissing=true) # 결측(missing)을 안 나오게 할 수 있다.
Out[8]:
DataFramesMeta - 데이터프레임
다루기 (working on DataFrame
)¶
In [9]:
using DataFramesMeta
df = DataFrame(x=1:8, y='a':'h', z=repeat([true,false], outer=4))
Out[9]:
In [10]:
@with(df, :x+:z) # 데이터프레임의 열로 표현함.
Out[10]:
In [11]:
@with df begin # 코드 블록(code block)을 정의할 수 있다.
a = :x[:z]
b = :x[.!:z]
:y + [a; b]
end
Out[11]:
In [12]:
a # @with는 변수가 누출되지 않도록 하드 스코프(hard scope)를 만든다.
In [13]:
df2 = DataFrame(a = [:a, :b, :c])
@with(df2, :a .== ^(:a)) # 때때로 원시기호로 작업하고 싶을때, ^() 를 사용한다.
Out[13]:
In [14]:
df2 = DataFrame(x=1:3, y=4:6, z=7:9)
@with(df2, _I_(2:3)) # _l_ 표현은 df2로 변환된다.
Out[14]:
In [15]:
@where(df, :x .< 4, :z .== true) # 필터링 하는 매크로를 사용하기에 매우 유용하다.
Out[15]:
In [16]:
@select(df, :x, y = 2*:x, z=:y) # 예전 데이터프레임으로부터 새로운 데이터프레임을 만든다.
Out[16]:
In [17]:
@transform(df, a=1, x = 2*:x, y=:x) # 예전 데이터프레임으로부터 새로운 데이터프레임을 만든다.
Out[17]:
In [18]:
@transform(df, a=1, b=:a) # 예전 데이터프레임이 사용되고, :a 는 여기서 사용되지 않는다.
In [19]:
@orderby(df, :z, -:x) # 새 데이터프레임으로 만들어지면서 정렬된다. sort보다 가볍다.
Out[19]:
In [20]:
@linq df |> # 데이터프레임의 물고 이어지는(체이닝 : chaining) 표현
where(:x .< 5) |>
orderby(:z) |>
transform(x²=:x.^2) |>
select(:z, :x, :x²)
Out[20]:
In [21]:
f(df, col) = df[col] # 체인 안에 유저가 정의한 새로운 함수를 넣을 수도 있다.
@linq df |> where(:x .<= 4) |> f(:x)
Out[21]:
DataFramesMeta - 그룹화된 데이터프레임
다루기¶
In [22]:
df = DataFrame(a = 1:12, b = repeat('a':'d', outer=3))
g = groupby(df, :b)
Out[22]:
In [23]:
@by(df, :b, first=first(:a), last=last(:a), mean=mean(:a)) # DataFrames 패키지의 by 보다 더 편하다.)
Out[23]:
In [24]:
@based_on(g, first=first(:a), last=last(:a), mean=mean(:a)) # by와 같지만, 그룹화된 데이터프레임에 적용한다.
Out[24]:
In [25]:
@where(g, mean(:a) > 6.5) # 그룹별로 조건을 비교해서, 해당되는 그룹만 골라낸다.
Out[25]:
In [26]:
@orderby(g, -sum(:a)) # 그룹별로 값을 계산해서, 그 순서대로 그룹을 정렬한다.
Out[26]:
In [27]:
@transform(g, center = mean(:a), centered = :a .- mean(:a)) # 그룹별로 계산하고, 그 결과는 그룹화 되지 않은 데이터프레임으로 나온다.
Out[27]:
In [28]:
DataFrame(g) # DataFrames 패키지에 없는 좋고 편리한 함수
Out[28]:
In [29]:
@transform(g) # 같은 결과를 낸다.
Out[29]:
In [30]:
@linq df |> groupby(:b) |> where(mean(:a) > 6.5) |> DataFrame # 그룹화된 데이터프레임에도 체이닝(chaining)을 사용할 수 있다.
Out[30]:
DataFramesMeta - 데이터프레임
에서 행별로 실행하는 함수들.¶
In [31]:
df = DataFrame(a = 1:12, b = repeat(1:4, outer=3))
Out[31]:
In [32]:
# 이런 조건들은 종종 필요하지만 쓰기 복잡하다.
@transform(df, x = ifelse.((:a .> 6) .& (:b .== 4), "yes", "no"))
Out[32]:
In [33]:
# 한 가지 방법은 하나의 관측치에 대해서 적용하는 함수를 만들고 이를 확장하는 것이다.
myfun(a, b) = a > 6 && b == 4 ? "yes" : "no"
@transform(df, x = myfun.(:a, :b))
Out[33]:
In [34]:
# 혹은 데이터프레임을 행별로 다룰 수 있게 해주는 @byrow!라는 매크로를 사용할 수 있다.
@byrow! df begin
@newcol x::Vector{String}
:x = :a > 6 && :b == 4 ? "yes" : "no"
end
Out[34]:
'Flux in Julia > Learning Julia (Intro_to_Julia_DFs)' 카테고리의 다른 글
13. extras (0) | 2018.10.20 |
---|---|
12. pitfalls (한글) (0) | 2018.10.19 |
12. pitfalls (0) | 2018.10.19 |
11. performance (한글) (0) | 2018.10.18 |
11. performance (0) | 2018.10.18 |