티스토리 뷰

#2 판다스 chapter 2. 데이터 추출하기

 

앞서 head 메서드를 이용해 데이터프레임 가장 앞에 있는 5개의 데이터를 추출하여 출력했던 것을 기억할 것이다. 이번에는 데이터프레임에서 데이터를 열 단위로 추출하는 방법과 행 단위로 추출하는 방법을 알아보자.

 

1. 열 단위 데이터 추출하기

 

1)

 

country_df = df['country']

print(type(country_df))

<class 'pandas.core.series.Series'>

print(country_df.head())

0    Afghanistan
1    Afghanistan
2    Afghanistan
3    Afghanistan
4    Afghanistan
Name: country, dtype: object

print(country_df.tail())

1699    Zimbabwe
1700    Zimbabwe
1701    Zimbabwe
1702    Zimbabwe
1703    Zimbabwe
Name: country, dtype: object

 

위처럼 데이터프레임(df)에서 열 이름인 country인 열을 추출하여 country_df 에 저장한 것이다. type 메서드를 사용하면 country_df에 저장된 데이터의 자료형이 시리즈라는 것을 확인 할 수 있다. 시리즈도 head,tail 메서드를 가지고 있어 가장 앞이나 뒤에 있는 5개의 데이터를 출력할 수 있다.

 

2)

 

리스트에 열 이름을 전달하면 여러개의 열을 한 번에 추출할 수 있다. 

 

subset = df[['country', 'continent','year']]
print(type(subset))


<class 'pandas.core.frame.DataFrame'>

print(subset.head())

     country continent  year
0  Afghanistan      Asia  1952
1  Afghanistan      Asia  1957
2  Afghanistan      Asia  1962
3  Afghanistan      Asia  1967
4  Afghanistan      Asia  1972

print(subset.tail())

   country continent  year
1699  Zimbabwe    Africa  1987
1700  Zimbabwe    Africa  1992
1701  Zimbabwe    Africa  1997
1702  Zimbabwe    Africa  2002
1703  Zimbabwe    Africa  2007

 

위는 1개의 열이 아니라 2개 이상의 열을 추출했기 때문에 시리즈가 아니라 데이터프레임을 얻을 수 있다.

 

2. 행 단위 데이터 추출하기

 

데이터를 행 단위로 추출하려면 loc, iloc 속성을 사용해야 한다. 간단하게 정리하면 다음과 같다.

 

loc   인덱스를 기준으로 행 데이터 추출
iloc  행 번호를 기준으로 행 데이터 추출

 

위 설명을 보면 인덱스와 행 번호라는 것이 있다. 파이썬을 공부했던 사람들이면 리스트 같은 자료형의 저장된 순서를 인덱스라고 하는것을 알 수 있다. 하지만 판다스에선 이런 개념을 행 번호라고 부른다.

 

3. 인덱스와 행 번호 개념 알아보기

 

 country continent  year  lifeExp       pop   gdpPercap
0  Afghanistan      Asia  1952   28.801   8425333  779.445314
1  Afghanistan      Asia  1957   30.332   9240934  820.853030
2  Afghanistan      Asia  1962   31.997  10267083  853.100710
3  Afghanistan      Asia  1967   34.020  11537966  836.197138
4  Afghanistan      Asia  1972   36.088  13079460  739.981106

 

이전에 실습했던 갭마인더에서 head 메서드를 실행한 결과이다.

 

왼쪽의번호가 바로 인덱스이다. 인덱스는 보통 0부터 시작하지만 행 데이터가 추가, 삭제되면 언제든지 변할 수 있으며 숫자가 아니라 문자열도 사용 가능하다. 즉 인덱스는 first,second,third 와 같은 문자열로 지정할 수도 있다. 반면 행 번호는 데이터의 순서를 따라가기 때문에 정수만으로 데이터를 조회하거나 추출할 수 있으며 실제 데이터프레임에서는 확인할 수 없는 값이다.

 

 

* loc속성으로 행 데이터 추출하기

 

loc 속성에 대괄호를 이용하여 인덱스를 전달하면 행 데이터를 추출할 수 있습니다. 아래 예제는 인덱스가 0인 행 데이터를 추출한 것입니다. 만약 -1과 같이 인덱스에 없는 값을 사용하면 오류가 발생한다.

 

print(df.loc[0])

country      Afghanistan
continent           Asia
year                1952
lifeExp           28.801
pop              8425333
gdpPercap     779.445314
Name: 0, dtype: object

print(df.loc[99])

country      Bangladesh
continent          Asia
year               1967
lifeExp          43.453
pop            62821884
gdpPercap    721.186086
Name: 99, dtype: object

 

 

만약 데이터프레임의 마지막 행 데이터를 추출하려면 어떻게 해야할까? shape[0]에 행크기가 저장되어 있다는 점을 이용하여 마지막 인덱스를 구할 수 있다.

 

number_of_rows = df.shape[0]
last_row_index = number_of_rows - 1
print(df.loc[last_row_index])

country        Zimbabwe
continent        Africa
year               2007
lifeExp          43.487
pop            12311143
gdpPercap    469.709298
Name: 1703, dtype: object

 

데이터프레임의 마지막 행 데이터를 추출하는 또 다른 방법은 tail메서드를 사용하는 것이다. 아래와 같이 tail메서드 인자 n에 1을 전달하면 마지막 행의 데이터를 추출할 수 있다.

 

print(df.tail(n=1))

     country continent  year  lifeExp       pop   gdpPercap
1703  Zimbabwe    Africa  2007   43.487  12311143  469.709298

 

만약에  인덱스가 0,99,999 인 데이터를 한번에 추출하려면 리스트에 원하는 인덱스를 담아 loc 속성에 전달하면 된다.

 

print(df.loc[[0, 99, 999]])

         country continent  year  lifeExp       pop    gdpPercap
0    Afghanistan      Asia  1952   28.801   8425333   779.445314
99    Bangladesh      Asia  1967   43.453  62821884   721.186086
999     Mongolia      Asia  1967   51.253   1149500  1226.041130

 

* iloc속성으로 행 데이터 추출하기

 

이번에는 iloc 속성으로 행 데이터를 추출하는 방법에 대해 알아보자. loc속성은 인덱스를 사용하여 데이터를 추출했지만 iloc 속성은 데이터 순서를 의미하는 행 번호를 사용하여 데이터를 추출한다. 다음은 iloc 속성에 1을 전달하여 데이터를 추출한 것이다.

 

print(df.iloc[1])

country      Afghanistan
continent           Asia
year                1957
lifeExp           30.332
pop              9240934
gdpPercap      820.85303
Name: 1, dtype: object

print(df.iloc[99])

print(df.iloc[99])
print(df.iloc[99])
country      Bangladesh
continent          Asia
year               1967
lifeExp          43.453
pop            62821884
gdpPercap    721.186086
Name: 99, dtype: object

 

iloc 속성은 음수를 사용해도 데이터를 추출할 수 있다. 하지만 데이터프레임에 아예 존재하지 않는 행 번호를 전달하면 오류가 발생한다.

 

print(df.iloc[-1])

country        Zimbabwe
continent        Africa
year               2007
lifeExp          43.487
pop            12311143
gdpPercap    469.709298
Name: 1703, dtype: object

 

iloc 속성도 아래와 같이 여러 데이터를 한 번에 추출할 수 있습니다.

 

print(df.iloc[[0, 99, 999]])

print(df.iloc[[0, 99, 999]])
         country continent  year  lifeExp       pop    gdpPercap
0    Afghanistan      Asia  1952   28.801   8425333   779.445314
99    Bangladesh      Asia  1967   43.453  62821884   721.186086
999     Mongolia      Asia  1967   51.253   1149500  1226.041130

 

4. loc, iloc 속성 자유자재로 사용하기

 

loc,iloc 속성을 자유자재로 사용하려면 추출할 데이터의 행과 열을 지정하는 방법을 알아야 한다. 두 속성 모두 추출할 데이터의 행을 먼저 지정하고 그런 다음 열을 지정하는 방법으로 데이터를 추출한다. 즉 df.loc[[행], [열]] 또는 df.iloc[[행], [열]] 과 같은 방법으로 코드를 작성하면 된다.

 

* 슬라이싱 구문으로 데이터 추출하기

 

다음은 모든 행의 데이터에 대해 year,pop열을 추출하는 방법이다. loc 속성의 열 지정값에 정수 리스트를 전달하면 오류가 발생한다. 반대로 iloc 속성의 열 지정값에 문자열 리스트를 전달하면 오류가 발생한다.

 

subset = df.loc[:, ['year', 'pop']]
print(subset.head())

   year       pop
0  1952   8425333
1  1957   9240934
2  1962  10267083
3  1967  11537966
4  1972  13079460

subset = df.iloc[:, [2, 4, -1]]
print(subset.head())

    year       pop   gdpPercap
0  1952   8425333  779.445314
1  1957   9240934  820.853030
2  1962  10267083  853.100710
3  1967  11537966  836.197138
4  1972  13079460  739.981106

 

* range 메서드로 데이터 추출하기

 

이번에는 iloc 속성과 파이썬 내장 메서드인 range를 응용하는 방법을 알아보자. range 메서드는 지정한 구간의 정수 리스트를 반환해 준다. iloc 속성의 열 지정값에는 정수 리스트를 전달해야 한다는 것과 range 메서드의 반환값이 정수 리스트인 점을 이용하여 데이터를 추출한다. range 메서드는 좀 더 정확하게 얘기하면 지정한 범위의 정수 리스트를 반환하는 것이 아니라 제네레이터를 반환한다. 다음은 range(5)가 반환한 제네레이터를 정숫값을 가진 [0, 1, 2, 3, 4, 5]로 변환하여 iloc의 열 지정값에 전달한 것이다.

 

small_range = list(range(5))
print(small_range)

[0, 1, 2, 3, 4]

print(type(small_range))

<class 'list'>

subset = df.iloc[:, small_range]
print(subset.head())

       country continent  year  lifeExp       pop
0  Afghanistan      Asia  1952   28.801   8425333
1  Afghanistan      Asia  1957   30.332   9240934
2  Afghanistan      Asia  1962   31.997  10267083
3  Afghanistan      Asia  1967   34.020  11537966
4  Afghanistan      Asia  1972   36.088  13079460

small_range = list(range(3,6))
print(small_range)

[3, 4, 5]

subset = df.iloc[:, small_range]
print(subset.head())

   lifeExp       pop   gdpPercap
0   28.801   8425333  779.445314
1   30.332   9240934  820.853030
2   31.997  10267083  853.100710
3   34.020  11537966  836.197138
4   36.088  13079460  739.981106

 

다음은 range 메서드에 range(0, 6, 2) 와 같은 방법으로 3개의 인자를 전달하면 0부터 5까지 2만큼 건너뛰는 제네레이터를 생성한다.

 

small_range = list(range(0, 6, 2))
subset = df.iloc[:, small_range]
print(subset.head())

       country  year       pop
0  Afghanistan  1952   8425333
1  Afghanistan  1957   9240934
2  Afghanistan  1962  10267083
3  Afghanistan  1967  11537966
4  Afghanistan  1972  13079460         

 

하지만 실무에서는 아래와 같이 range 메서드보다는 간편하게 사용할 수 있는 파이썬 슬라이싱 구문을 사용한다. 아래와 같이 따라해 보자. 예를 들어 list(range(3))과 [:3]의 결괏값은 동일하다.

subset = df.iloc[:, :3]
print(subset.head())

      country continent  year
0  Afghanistan      Asia  1952
1  Afghanistan      Asia  1957
2  Afghanistan      Asia  1962
3  Afghanistan      Asia  1967
4  Afghanistan      Asia  1972

 

아래 예제는 위에서 해보았던 0,6,2를 슬라이싱 구문으로 구현한 것이다. 결과는 같다.

 

subset = df.iloc[:,0:6:2]
print(subset.head())

       country  year       pop
0  Afghanistan  1952   8425333
1  Afghanistan  1957   9240934
2  Afghanistan  1962  10267083
3  Afghanistan  1967  11537966
4  Afghanistan  1972  13079460

 

만약 iloc 속성으로 0, 99 ,999번째 행의 0, 3, 5번째 열 데이터를 추출하려면 다음과 같이 코드를 작성하면 된다.

 

print(df.iloc[[0,99,999], [0,3,5]])

         country  lifeExp    gdpPercap
0    Afghanistan   28.801   779.445314
99    Bangladesh   43.453   721.186086
999     Mongolia   51.253  1226.041130

 

하지만 위 예제처럼 작성한 코드는 나중에 어떤 데이터를 추출하기 위한 코드인지 파악하지 못 할 수도 있기 때문에 아래와 같이 loc 속성을 사용하여 열 지정값으로 열 이름을 전달한다.

 

print(df.loc[[0,99,999], ['country', 'lifeExp', 'gdpPercap']])

         country  lifeExp    gdpPercap
0    Afghanistan   28.801   779.445314
99    Bangladesh   43.453   721.186086
999     Mongolia   51.253  1226.041130

 

마지막으로 인덱스가 10부터 13인 행의 country, lifeExp, gdpPercap 열 데이터를 추출해보자.

 

print(df.loc[10:13, ['country', 'lifeExp', 'gdpPercap']])

        country  lifeExp    gdpPercap
10  Afghanistan   42.129   726.734055
11  Afghanistan   43.828   974.580338
12      Albania   55.230  1601.056136
13      Albania   59.280  1942.284244

 

 

출처 :  데이터 분석을 위한 판다스 입문

데이터 출처 : github.com/easysIT/doit_pandas

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함