티스토리 뷰
#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
출처 : 데이터 분석을 위한 판다스 입문
'판다스 입문' 카테고리의 다른 글
판다스 데이터프레임과 시리즈( 데이터 프레임 다루기) (0) | 2021.03.20 |
---|---|
판다스 데이터프레임과 시리즈 (시리즈 응용하기) (0) | 2021.03.18 |
판다스 데이터프레임과 시리즈(시리즈 다루기) (0) | 2021.03.18 |
판다스의 시작(기초적인 통계 계산, 그래프 그리기) (0) | 2021.03.18 |
판다스의 시작(데이터 집합 불러오기) (0) | 2021.03.14 |