티스토리 뷰
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)(한글)
패키지 DataFrames
을 먼저 부르면서 시작하자.
using DataFrames
생성자(Constructors) 와 변환(conversion)¶
생성자(Constructors)¶
이 세션에서, 우리는 DataFrame()
생성자를 이용해서 데이터프레임
(DataFrame
)을 생성하는 많은 방법을 배울거다.
먼저, 빈(empty) 데이터프레임은 쉽게 만들 수 있다.
DataFrame() # empty DataFrame
혹은 키워드 인수(keyword arguments)를 이용해서 데이터프레임
에 열을 추가할 수 있다.
DataFrame(A=1:3, B=rand(3), C=randstring.([3,3,3])) # 그냥 쓰면 오류난다.
using Random
DataFrame(A=1:3, B=rand(3), C=Random.randstring.([3,3,3]))
데이터프레임
을 딕셔너리(dictionary)로 부터 만들 수도 있는데, 이 경우 키(key)별로 정렬되어 열 이름으로 들어간다.
x = Dict("A" => [1,2], "B" => [true, false], "C" => ['a', 'b'])
DataFrame(x)
위의 예제는 딕셔너리를 먼저 만들어줬지만, 데이터프레임
의 인수를 딕셔너리 키-값(key-value) 쌍으로 넣을 수도 있다.
참고로 이 경우, :
기호를 사용해서 열 이름을 선언하며, 키별로 정렬되지 않는다. 예를 들어, A
라는 열을 만들고 싶다면 :A
로 선언한다.
DataFrame(:A => [1,2], :B => [true, false], :C => ['a', 'b'])
아래는 벡터(vector)의 벡터(vector)로부터 데이터프레임
을 만든 것인데, 이 때 각각의 벡터가 열이 된다.
DataFrame([rand(3) for i in 1:3])
벡터
의 원소로 이루어진 한 행의 데이터프레임
을 만드려면, 아래와 같이 쓰면 될 것 같지만, 작동하지 않고 에러를 뱉어낸다. (예전에는 작동했지만 현재는 폐기되고 작동하지 않는다.)
DataFrame(rand(3))
그래서 전치된(transposed) 벡터를 사용해야 한다.(이렇게하면 지원되는 생성자에 2차원 배열을 효과적으로 전달할 수 있다.)
DataFrame(transpose([1, 2, 3]))
두 번재 인수(argument)에 열 이름을 줄 수 있다.
DataFrame([1:3, 4:6, 7:9], [:A, :B, :C])
아래는 행렬(matrix)로부터 데이터프레임
을 만들었다.
DataFrame(rand(3,4))
그리고 똑같이 두 번째 인수에 이름을 넣을 수 있다.
DataFrame(rand(3,4), Symbol.('a':'d'))
또한 초기화되지 않은(uninitialized) 데이터프레임을 생성할 수도 있다.
열 타입(type)과 이름, 열 갯수를 넣은 결과가 아래에 있다. Any >: Missing
이기 대문에 열 :C 에서 missing
을 얻었다.
DataFrame([Int, Float64, Any], [:A, :B, :C], 1)
아래는 같은 데이터프레임
인데, 열 :C
가 #undef 이다.
DataFrame([Int, Float64, String], [:A, :B, :C], 1)
열 이름은 있지만 행은 없는 데이터프레임
을 선언할 수도 있다.
DataFrame([Int, Float64, String], [:A, :B, :C], 0)
아래는 동질적인(Homogeneous) 데이터프레임
을 빠르게 생성하는 구문이다.
DataFrame(Int, 3, 5)
비슷하지만, 동질적이지 않은(nonhomogeneous) 열인 경우는 아래처럼 하면 된다.
DataFrame([Int, Float64], 4)
마지막으로 기존 데이터프레임
을 복사하여 데이터프레임
을 만들 수 있다.
참고로 copy
는 단순한 복사본을 만들 때 사용한다.
y = DataFrame(x)
z = copy(x)
x
y
z
(x === y), (x === z), isequal(x, z)
행렬로의 변환(Conversion)¶
열 2개와 행 2개인 데이터프레임
을 생성하면서 시작하자.
x = DataFrame(x=1:2, y=["A", "B"])
Matrix
함수를 이용해서 데이터프레임
을 행렬로 만들 수 있다.
Matrix(x)
만약 데이터프레임
에 missing
이 있더라도 먹힌다.
x = DataFrame(x=1:2, y=[missing,"B"])
Matrix(x)
이전의 두 예제에서, Julia는 Any
타입을 원소로 가지는 행렬로 변환했다. 이는 우리가 넣는 데이터프레임
에 따라서 알아서 유추하는데, 아래의 예를 보면 명확하게 알 수 있다. 정수의 데이터프레임
을 Matrix
에 전달하면, 타입이 Int64인 2D 배열(array)을 생성한다.
x = DataFrame(x=1:2, y=3:4)
Matrix(x)
다음 예제는 Julia가 Union
을 이용해서 올바로 유추하는 것을 볼 수 있다.
x = DataFrame(x=1:2, y=[missing,4])
Matrix(x)
참고로 missing
은 Int
로 강제로 변환할 수 없다!
Matrix{Int}(x)
열 이름 중복¶
데이터프레임
에는 기본적으로 열 이름을 반복적으로 쓸 수 없다. makeunique
키워드 인수를 사용해서 반복되는 이름을 반복되지 않게 자동적으로 바꿀 수 있다.
df = DataFrame(:a=>1, :a=>2, :a_1=>3; makeunique=true)
그냥 써도 warning이 뜰 뿐, 이름을 자동적으로 바꾼다.
df = DataFrame(:a=>1, :a=>2, :a_1=>3)
열 이름을 인자(argument)로 쓰는 경우에는, makeunique
를 써도 자동적으로 반복되지 않게 바꿀 수 없다.
df = DataFrame(a=1, a=2, makeunique=true)
'Flux in Julia > Learning Julia (Intro_to_Julia_DFs)' 카테고리의 다른 글
03. missingvalues (한글) (0) | 2018.10.09 |
---|---|
03. missingvalues (0) | 2018.10.09 |
02. basicinfo (한글) (0) | 2018.10.08 |
02. basicinfo (0) | 2018.10.08 |
01. Constructors (0) | 2018.10.07 |