티스토리 뷰
Introduction to DataFrames¶
Bogumił Kamiński, 2018년 5월 23일
출처¶
함께보기¶
- 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)(한글)
using DataFrames # load package
데이터프레임의 열 다루기 (Manipulating columns of DataFrame)¶
열 이름 다시 붙이기 (Renaming columns)¶
기본 열 이름을 갖고있는 논리값
으로 이루어진 데이터프레임
으로 시작해보자.
x = DataFrame(Bool, 3, 4)
rename
을 이용해서, 새로운 DataFrame
을 만들 수 있다. 여기서는 :x1
을 :A
로 바꿨다. (물론 rename
으로 여러 쌍을 바꿀 수도 있다.)
rename(x, :x1 => :A)
rename!
으로 우리는 in place transformation도 할 수 있다.
이번에는 모든 열 이름에 대해서 적용시켜봤다.
rename!(c -> Symbol(string(c)^2), x)
우리는 또한 특정한 열 이름을 몰라도 바꿀 수 있다.
여기서는 3열의 이름을 바꾸고 새로운 데이터프레임
을 만들었다.
rename(x, names(x)[3] => :third)
names!
를 이용해서, 모든 열의 이름을 바꿀 수 있다.
names!(x, [:a, :b, :c, :d])
이름을 중복되게 설정하려고 하면 에러난다.
names!(x, fill(:a, 4))
makeunique=true
를 사용하면, 중복되는 이름도 사용할 수 있게 되지만, 조금 다르게 들어간다.
names!(x, fill(:a, 4), makeunique=true)
열 재배치 (Reordering columns)¶
우리는 names(x) 벡터를 필요에 따라 재배치 할 수 있다.
using Random
Random.seed!(1234) #srand(1234)
x[shuffle(names(x))]
또한 permutecols!
를 이용해도 바꿀 수 있다.
permutecols!(x, [2, 1, 3, 4])
permutecols!(x, [:a, :a_1, :a_2, :a_3])
열 추가 혹은 합치기 (Merging/adding columns)¶
x = DataFrame([(i,j) for i in 1:3, j in 1:4])
hcat
으로, 우리는 두 데이터프레임
을 합칠 수 있다. 열 이름이 유일하다면 [x y] 구문을 이용해서도 합칠 수 있다.
hcat(x, x, makeunique=true)
[x x]
hcat
을 이용해서 새로운 열을 추가할 수도 있다. 이 때, 이름은 :x1
로 고정되는데, makeunique=true
가 필요할 수도 있다.
y = hcat(x, [1,2,3], makeunique=true)
[x [1,2,3]]
hcat
을 이용해서 앞에 붙일 수도 있다.
hcat([1,2,3], x, makeunique=true)
[[1,2,3] x]
다음과 같은 구문도 사용할 수 있다. 좀 장황한 감이 있지만 깔끔하다.
y = [x DataFrame(A=[1,2,3])]
아래는 같지만 :A
열이 앞에 붙는다.
y = [DataFrame(A=[1,2,3]) x]
또한 열을 중간에 추가할 수도 있다. 여기서는 brute-force 방법을 사용해서 새 데이터프레임을 만들었다.
using BenchmarkTools
@btime [$x[1:2] DataFrame(A=[1,2,3]) $x[3:4]]
또한 insert!
를 이용해서 데이터프레임 y
에 :newcol
을 추가할 수 있다.
insert!(y, 2, [1,2,3], :newcol)
만약에 여러 번 같은 열을 넣는다면 makeunique=true
를 사용하는 것이 좋다.
insert!(y, 2, [1,2,3], :newcol, makeunique=true)
@btime
을 통해 시간을 확인해보면 hcat
을 쓰는 것보다 insert!
를 쓰는 것이 더 빠르다는 것을 알 수 있다.
@btime insert!(copy($x), 3, [1,2,3], :A)
insert!
를 사용해서 하나의 행을 오른쪽에 더 만들어보고,
insert!(x, ncol(x)+1, [1,2,3], :A)
왼쪽에 더 만들어보자.
insert!(x, 1, [1,2,3], :B)
merge!
를 이용해서 2번째 데이터프레임을 첫번째 데이터프레임에 합쳐보자(merge). 겹치는 것들은 덮어쓰기 한다.
df1 = DataFrame(x=1:3, y=4:6)
df2 = DataFrame(x='a':'c', z = 'd':'f', new=11:13)
df1, df2, merge!(df1, df2)
비교를 위해서, hcat
으로도 합쳐보자. 이 때, 겹치는 이름은 안 겹치도록 수정하게 된다.
df1 = DataFrame(x=1:3, y=4:6)
df2 = DataFrame(x='a':'c', z = 'd':'f', new=11:13)
println(df1)
println(df2)
hcat(df1, df2, makeunique=true)
merge!(df1, df2)
열의 일부만 가져오거나 열 지우기 (Subsetting/removing columns)¶
먼저 새로운 데이터프레임 x
를 만든 다음에 x
열의 일부만 가져와서 새로운 데이터프레임을 만드는 몇 가지 방법을 알아보자.
x = DataFrame([(i,j) for i in 1:3, j in 1:5])
첫번째 방법은 인덱스(index)를 이용하는 방법이다.
x[[1,2,4,5]]
혹은 열 이름을 이용하는 방법이다.
x[[:x1, :x4]]
또한 논리값
을 이용해서도 열을 유지하거나 제거할 수 있다. (이 때, 원래 데이터프레임
의 열의 갯수와 같은 벡터가 필요하다.)
x[[true, false, true, false, true]]
여기서는 데이터프레임
형태를 유지하면서 열 하나만 선택했고,
x[[:x1]]
여기서는 x1
열의 원소들을 벡터로 가져왔다.
x[:x1]
열 번호로 같은 벡터를 가져올 수도 있다.
x[1]
그리고 empty!
를 이용해서 내용을 다 없엘 수도 있다.
empty!(y)
여기서는 x
의 복사본을 만들었고, delete!
를 이용해서 복사본의 3열을 지웠다.
z = copy(x)
x, delete!(z, 3)
이름으로 열 수정하기 (Modify column by name)¶
x = DataFrame([(i,j) for i in 1:3, j in 1:5])
다음 구문을 이용해서, 복사하지 않고 열을 수정할 수 있다.
x[:x1] = x[:x2]
x
우리는 또한 다음 구문을 이용해서 데이터프레임
의 마지막에 새로운 열을 추가할 수 있다.
x[:A] = [1,2,3]
x
다음 구문도 마찬가지로 마지막에 새로운 열을 추가하는 구문이다. (7은 ncol(x)+1
과 같다.)
x[7] = 11:13
x
열이름 찾기 (Find column name)¶
x = DataFrame([(i,j) for i in 1:3, j in 1:5])
우리는 다음 구문을 사용해서 주어진 이름이 열에 있는지 확인 할 수 있다.
:x1 in names(x)
그리고 다음 구문을 사용해서 주어진 이름이 몇 번째 열 이름인지 알 수 있다.
findfirst(names(x) .== :x2)
'Flux in Julia > Learning Julia (Intro_to_Julia_DFs)' 카테고리의 다른 글
06. rows (한글) (0) | 2018.10.12 |
---|---|
06. rows (0) | 2018.10.12 |
05. columns (0) | 2018.10.11 |
04. loadsave (한글) (0) | 2018.10.10 |
04. loadsave (0) | 2018.10.10 |