티스토리 뷰

06_rows(한글)

Introduction to DataFrames

Bogumił Kamiński, Apr 21, 2018

출처

함께보기

In [1]:
using DataFrames, Random # load package
Random.seed!(1); #srand(1);

데이터프레임의 행 다루기 (Manipulating rows of DataFrame)

행 재배치하기 (Reordering rows)

In [2]:
x = DataFrame(id=1:10, x = rand(10), y = [zeros(5); ones(5)]) # x[:x]가 크기 순이 아니길 바란다. ^^;
In [3]:
issorted(x), issorted(x, :x) # 데이터프레임이나 데이터프레임의 한 행이 크기순으로 정렬돼있는지를 확인한다.
Out[3]:
(true, false)
In [4]:
sort!(x, :x) # in place로 x를 :x를 기준으로 정렬한다.
Out[4]:
idxy
Int64Float64Float64
140.007909280.0
260.2109681.0
310.2360330.0
490.2516621.0
530.3127070.0
620.3465170.0
750.4886130.0
870.9519161.0
9100.9866661.0
1080.9999051.0
In [5]:
y = sort(x, :id) # :id 기준으로 정렬한 후 새로운 데이터프레임을 만든다.
Out[5]:
idxy
Int64Float64Float64
110.2360330.0
220.3465170.0
330.3127070.0
440.007909280.0
550.4886130.0
660.2109681.0
770.9519161.0
880.9999051.0
990.2516621.0
10100.9866661.0
In [6]:
sort(x, (:y, :x), rev=(true, false)) # 행 2개를 기준으로 정렬하는데, 첫번째는 내림차순, 두 번째는 오름차순 이다.
Out[6]:
idxy
Int64Float64Float64
160.2109681.0
290.2516621.0
370.9519161.0
4100.9866661.0
580.9999051.0
640.007909280.0
710.2360330.0
830.3127070.0
920.3465170.0
1050.4886130.0
In [7]:
sort(x, (order(:y, rev=true), :x)) # 위와 같은 작업을 하는 코드이다.
Out[7]:
idxy
Int64Float64Float64
160.2109681.0
290.2516621.0
370.9519161.0
4100.9866661.0
580.9999051.0
640.007909280.0
710.2360330.0
830.3127070.0
920.3465170.0
1050.4886130.0
In [8]:
sort(x, (order(:y, rev=true), order(:x, by=v->-v))) # 더 있어보이는 정렬방법이다.
Out[8]:
idxy
Int64Float64Float64
180.9999051.0
2100.9866661.0
370.9519161.0
490.2516621.0
560.2109681.0
650.4886130.0
720.3465170.0
830.3127070.0
910.2360330.0
1040.007909280.0
In [9]:
x[shuffle(1:10), :] # index를 이용해서 정렬하는 방법이다. (여기서는 무작위로 섞었다.)
Out[9]:
idxy
Int64Float64Float64
180.9999051.0
2100.9866661.0
370.9519161.0
420.3465170.0
550.4886130.0
610.2360330.0
760.2109681.0
890.2516621.0
940.007909280.0
1030.3127070.0
In [10]:
sort!(x, :id)
x[[1,10],:] = x[[10,1],:] # 행을 바꿨다.
x
Out[10]:
idxy
Int64Float64Float64
1100.9866661.0
220.3465170.0
330.3127070.0
440.007909280.0
550.4886130.0
660.2109681.0
770.9519161.0
880.9999051.0
990.2516621.0
1010.2360330.0
In [11]:
x[1,:], x[10,:] = x[10,:], x[1,:] # 행을 또 다시 바꿨다.
x
Out[11]:
idxy
Int64Float64Float64
110.2360330.0
220.3465170.0
330.3127070.0
440.007909280.0
550.4886130.0
660.2109681.0
770.9519161.0
880.9999051.0
990.2516621.0
10100.9866661.0

행 합치기 또는 추가하기 (Merging/adding rows)

In [12]:
x = DataFrame(rand(3, 5))
Out[12]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
In [13]:
[x; x] # 행 합치기다. 반드시 열의 수가 같아야한다. (vcat과 같다.)
Out[13]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
40.08563520.1858210.05161460.2793950.370971
50.5532060.1119810.538030.1782460.894166
60.463350.9763120.4556920.5489830.648054
In [14]:
y = x[reverse(names(x))] # 행의 순서를 바꿔서 y로 저장했다.
Out[14]:
x5x4x3x2x1
Float64Float64Float64Float64Float64
10.3709710.2793950.05161460.1858210.0856352
20.8941660.1782460.538030.1119810.553206
30.6480540.5489830.4556920.9763120.46335
In [15]:
vcat(x, y) # vcat을 이용하면 이름을 매칭시켜서 합친다.
Out[15]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
40.08563520.1858210.05161460.2793950.370971
50.5532060.1119810.538030.1782460.894166
60.463350.9763120.4556920.5489830.648054
In [16]:
vcat(x, y[1:3]) # 그러나 열 이름이 여전히 매치되어야한다.
ArgumentError: column(s) x1 and x2 are missing from argument(s) 2

Stacktrace:
 [1] _vcat(::Array{DataFrame,1}) at /home/yt/.julia/packages/DataFrames/1PqZ3/src/abstractdataframe/abstractdataframe.jl:926
 [2] vcat(::DataFrame, ::DataFrame) at /home/yt/.julia/packages/DataFrames/1PqZ3/src/abstractdataframe/abstractdataframe.jl:906
 [3] top-level scope at In[16]:1
In [17]:
append!(x, x) # 깉은 결과를 내지만 x 자체를 수정한다.
Out[17]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
40.08563520.1858210.05161460.2793950.370971
50.5532060.1119810.538030.1782460.894166
60.463350.9763120.4556920.5489830.648054
In [18]:
append!(x, y) # 여기서는 열 이름이 반드시 정확하게 같이야한다.
Column names do not match

Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] append!(::DataFrame, ::DataFrame) at /home/yt/.julia/packages/DataFrames/1PqZ3/src/dataframe/dataframe.jl:990
 [3] top-level scope at In[18]:1
In [19]:
push!(x, 1:5) # 행 하나를 추가하는 방법이다. 반드시 열의 숫자와 같아야하고 type도 맞아야한다.
x
Out[19]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
40.08563520.1858210.05161460.2793950.370971
50.5532060.1119810.538030.1782460.894166
60.463350.9763120.4556920.5489830.648054
71.02.03.04.05.0
In [20]:
push!(x, Dict(:x1=> 11, :x2=> 12, :x3=> 13, :x4=> 14, :x5=> 15)) # 딕셔너리(dictionary)를 이용해서도 할 수 있다.
x
Out[20]:
x1x2x3x4x5
Float64Float64Float64Float64Float64
10.08563520.1858210.05161460.2793950.370971
20.5532060.1119810.538030.1782460.894166
30.463350.9763120.4556920.5489830.648054
40.08563520.1858210.05161460.2793950.370971
50.5532060.1119810.538030.1782460.894166
60.463350.9763120.4556920.5489830.648054
71.02.03.04.05.0
811.012.013.014.015.0

일부 행 가져오기 또는 행 지우기 (Subsetting/removing rows)

In [21]:
x = DataFrame(id=1:10, val='a':'j')
Out[21]:
idval
Int64Char
11'a'
22'b'
33'c'
44'd'
55'e'
66'f'
77'g'
88'h'
99'i'
1010'j'
In [22]:
x[1:2, :] # 인덱스(index)로 가져오기.
Out[22]:
idval
Int64Char
11'a'
22'b'
In [23]:
view(x, 1:2) # 같은 방법이지만 view를 이용했다.
Out[23]:
idval
Int64Char
11'a'
22'b'
In [24]:
x[repeat([true, false], 5), :] # 논리값(Bool)을 이용하기. 길이가 정확하게 일치해야 한다.
#x[repmat([true, false], 5), :]
Out[24]:
idval
Int64Char
11'a'
23'c'
35'e'
47'g'
59'i'
In [25]:
view(x, repeat([true, false], 5), :) # 다시 view를 이용해서 보기.
#view(x, repmat([true, false], 5), :)
Out[25]:
idval
Int64Char
11'a'
23'c'
35'e'
47'g'
59'i'
In [26]:
deleterows!(x, 7) # 행 하나 지우기
Out[26]:
idval
Int64Char
11'a'
22'b'
33'c'
44'd'
55'e'
66'f'
78'h'
89'i'
910'j'
In [27]:
deleterows!(x, 6:7) # 여러 행 지우기
Out[27]:
idval
Int64Char
11'a'
22'b'
33'c'
44'd'
55'e'
69'i'
710'j'
In [28]:
x = DataFrame([1:4, 2:5, 3:6])
Out[28]:
x1x2x3
Int64Int64Int64
1123
2234
3345
4456
In [29]:
filter(r -> r[:x1] > 2.5, x) # filter를 이용해서 조건에 맞는 행 골라오기
Out[29]:
x1x2x3
Int64Int64Int64
1345
2456
In [30]:
# do-block 구문을 이용해서 in place로 x 수정하는 예시.
filter!(x) do r
    if r[:x1] > 2.5
        return r[:x2] < 4.5
    end
    r[:x3] < 3.5
end
Out[30]:
x1x2x3
Int64Int64Int64
1123
2345

중복삭제 (Deduplicating)

In [31]:
x = DataFrame(A=[1,2], B=["x","y"])
append!(x, x)
x[:C] = 1:4
x
Out[31]:
ABC
Int64StringInt64
11x1
22y2
31x3
42y4
In [32]:
unique(x, [1,2]) # 주어진 index에서 유일한 첫번째 열 가져오기
Out[32]:
ABC
Int64StringInt64
11x1
22y2
In [33]:
unique(x) # 지금은 모든 열을 가져온다.
Out[33]:
ABC
Int64StringInt64
11x1
22y2
31x3
42y4
In [34]:
nonunique(x, :A) # 유일하지 않은 열의 지시자(indeicator)를 알 수 있다.
Out[34]:
4-element Array{Bool,1}:
 false
 false
  true
  true
In [35]:
unique!(x, :B) # in place로 x를 수정한다.
Out[35]:
ABC
Int64StringInt64
11x1
22y2

데이터프레임의 한 열을 벡터로 불러오기 (Extracting one row from DataFrame into a vector)

In [36]:
x = DataFrame(x=[1,missing,2], y=["a", "b", missing], z=[true,false,true])
Out[36]:
xyz
Int64⍰String⍰Bool
11atrue
2missingbfalse
32missingtrue
In [37]:
cols = [:x, :y]
[x[1, col] for col in cols] # 행의 일부
Out[37]:
2-element Array{Any,1}:
 1   
  "a"
In [38]:
[[x[i, col] for col in names(x)] for i in 1:nrow(x)] # 벡터의 벡터. 각 원소는 x의 한 행 전체이다.
Out[38]:
3-element Array{Array{Any,1},1}:
 [1, "a", true]       
 [missing, "b", false]
 [2, missing, true]   
In [39]:
Tuple(x[1, col] for col in cols) # 비슷하게 튜플(Tuple)로 가져올 수도 있다.
Out[39]:
(1, "a")

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

07. factors (한글)  (0) 2018.10.13
07. factors  (0) 2018.10.13
06. rows  (0) 2018.10.12
05. columns (한글)  (0) 2018.10.11
05. columns  (0) 2018.10.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
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
글 보관함