본문 바로가기

카테고리 없음

[파이썬] Pandas 행과 열로 데이터 추출하기: loc[ ], iloc[ ]

판다스에서 데이터를 행과 열로 데이터를 추출하는 방법을 살펴보겠습니다. 몇 가지 기본 문법만 숙지하면 다양한 방식으로 응용할 수 있습니다. 먼저 컬럼 데이터를 추출하는 방법을 알아보겠습니다.

 

데이터 불러오기

In [1]:
# 판다스 라이브러리 임포트
import pandas as pd
# plotly express에 내장되어있는 gapminder 데이터프레임을 사용하겠습니다.
import plotly.express as px
# plotly가 설치되어있지 않다면 아래 명령으로 설치할 수 있습니다.
# !pip install plotly

# 데이터 불러오기
df = px.data.gapminder()

 

컬럼 데이터 추출하기

데이터프레임에서 컬럼 데이터를 추출하려면 대괄호([ ])와 컬럼명을 사용해야 합니다. 이 대괄호 안에 컬럼명을 집어넣으면 컬럼명에 맞는 컬럼 데이터가 추출됩니다. 이렇게 추출된 데이터는 변수에 할당(저장)하여 사용할 수 있습니다.

 

In [2]:
# 대괄호와 컬럼명을 사용하여 원하는 컬럼을 추출합니다. 
# 이때 컬럼명은 작은 따옴표 또는 큰 따옴표를 사용해 감싸주어야 합니다.
# 추출된 컬럼 데이터를 country라는 이름의 새로운 변수에 할당합니다.
country = df['country']

# 대괄호가 하나인 경우에는 Series를 반환합니다.
print(type(country))
country.head()
<class 'pandas.core.series.Series'>
 
Out[2]:
0    Afghanistan
1    Afghanistan
2    Afghanistan
3    Afghanistan
4    Afghanistan
Name: country, dtype: object
 
 

여러 개의 컬럼 데이터를 추출하는 경우에는 대괄호를 두번([[ ]]) 사용합니다. 

 

In [3]:
# 여러 개의 컬럼 데이터를 추출하는 경우에는 대괄호를 두번 사용합니다. [[]]
# 리스트 이용하여 컬럼명을 대괄호 안에 집어넣은 것입니다.
countries_by_continents = df[['country', 'continent']]

# 대괄호가 두개인 경우에는 DataFrame을 반환합니다.
print(type(countries_by_continents))
countries_by_continents.head()
<class 'pandas.core.frame.DataFrame'>
 
Out[3]:
 
  country continent
0 Afghanistan Asia
1 Afghanistan Asia
2 Afghanistan Asia
3 Afghanistan Asia
4 Afghanistan Asia

 

대괄호를 두번 사용하는 문법을 조금 더 자세히 살펴보겠습니다. 위의 코드를 리스트를 사용해서 다시 실행시켜 보겠습니다.

 

In [4]:
# columns라는 새로운 변수에 리스트를 할당합니다.
# 이 리스트에는 컬럼명 'country'와 'continent'가 들어갑니다.
columns = ['country', 'continent']

# 이 리스트를 대괄호 안에 집어넣습니다.
countries_by_continents = df[columns]

# 결과를 출력합니다.
print(type(countries_by_continents))
countries_by_continents.head()
<class 'pandas.core.frame.DataFrame'>
 
Out[4]:
 
  country continent
0 Afghanistan Asia
1 Afghanistan Asia
2 Afghanistan Asia
3 Afghanistan Asia
4 Afghanistan Asia

 

동일한 결과가 나온 것을 알 수 있습니다. 그러므로 1) 대괄호를 두 번 쓰는 코드와 2) 대괄호 + 리스트를 사용한 코드는 같은 코드라고 볼 수 있습니다.

 

행 데이터 추출하기

이번에는 행 데이터를 추출하는 문법을 배워보겠습니다. 데이터프레임에서 행 데이터를 추출하는 방법은 두가지가 있습니다. 1) .loc 속성을 사용하는 방법과 2) .iloc 속성을 사용하는 방법입니다. 

 .loc[] 은 인덱스(index)를 기준으로 행 데이터를 추출합니다. 
 .iloc[]은 행 번호를 기준으로 행 데이터를 추출합니다. 

자세한 내용은 아래 예제를 보면서 알아보겠습니다.

 

In [5]:
# print() 함수를 이용하지 않아도 주피터 노트북이 결과를 출력해줍니다.
# 단, 이 경우 마지막 명령만 출력됩니다.
df.head()
 
Out[5]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
 
위의 데이터프레임을 잘 보시면 왼쪽에 번호가 있는 것을 알 수 있습니다. 이것이 바로 인덱스입니다. 인덱스를 별도로 설정하지 않았다면 보통 0부터 시작합니다. 행 추가, 삭제에 따라 언제든 변할 수 있으며 인덱스 설정을 통해 문자열을 사용할 수도 있습니다. 

반면 행 번호의 경우에는 테이터프레임에 출력되는 값이 아니며, 문자 그대로 행의 순서를 말합니다.
 
 
In [6]:
# .loc[] 이용하여 행 데이터를 추출할 수 있습니다.
# 대괄호 안에는 인덱스를 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 Series를 반환합니다.
print(type(df.loc[0]))
df.loc[0]
<class 'pandas.core.series.Series'>
 
Out[6]:
country      Afghanistan
continent           Asia
year                1952
lifeExp           28.801
pop              8425333
gdpPercap        779.445
iso_alpha            AFG
iso_num                4
Name: 0, dtype: object

 

 

여러개의 행 데이터를 추출하기 위해서는 대괄호를 두번 사용합니다. 컬럼을 추출하는 것과 유사합니다.

 

In [7]:

# 여러 개의 행 데이터를 추출하기 위해서
# 인덱스 리스트를 만들어 .loc[] 안에 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 DataFrame을 반환합니다.
print(type(df.loc[[0, 3, 6, 9]]))
df.loc[[0, 3, 6, 9]]
<class 'pandas.core.frame.DataFrame'>
 
Out[7]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
6 Afghanistan Asia 1982 39.854 12881816 978.011439 AFG 4
9 Afghanistan Asia 1997 41.763 22227415 635.341351 AFG 4

 

이외에도 파이썬 슬라이싱(slicing)과 유사한 문법을 사용하여 행을 추출할 수도 있습니다. 이 경우 [start:end]와 같은 형태이며, start부터 end까지의 모든 행을 추출합니다.

 

In [8]:
# 아래와 같은 방법으로 여러개의 행 데이터를 추출할 수 있습니다.
# 이 경우 인덱스 1부터 6까지 총 6개를 추출합니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 DataFrame을 반환합니다.
print(type(df.loc[1:6]))
df.loc[1:6]
<class 'pandas.core.frame.DataFrame'>
 
Out[8]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
5 Afghanistan Asia 1977 38.438 14880372 786.113360 AFG 4
6 Afghanistan Asia 1982 39.854 12881816 978.011439 AFG 4

 

이번에는 .iloc[] 속성을 활용하여 행 데이터를 추출하는 방법을 알아보겠습니다. .iloc[]은 행의 순서를 나타내는 번호를 사용하여 데이터를 추출합니다. 지금은 인덱스와 행 번호가 동일하여 모두 같은 결과 값이 출력됩니다.

다만, 추후 행 추가 및 삭제, 인덱스 설정을 통한 문자열을 사용 등의 변경 사항이 생긴다면 결과 값은 달라지게 됩니다.

 

In [9]:
# .iloc[] 이용하여 행 데이터를 추출할 수 있습니다.
# 대괄호 안에는 행 번호를 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 Series를 반환합니다.
print(type(df.iloc[0]))
df.iloc[0]
<class 'pandas.core.series.Series'>
 
Out[9]:
country      Afghanistan
continent           Asia
year                1952
lifeExp           28.801
pop              8425333
gdpPercap        779.445
iso_alpha            AFG
iso_num                4
Name: 0, dtype: object
 

.loc[]과 마찬가지로 여러개의 행 데이터를 추출하기 위해서는 대괄호를 두번 사용합니다. 컬럼을 추출하는 것과 유사합니다.

 

In [10]:

# 여러 개의 행 데이터를 추출하기 위해서
# 행 번호 리스트를 만들어 .iloc[] 안에 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 DataFrame을 반환합니다.
print(type(df.iloc[[0, 3, 6, 9]]))
df.iloc[[0, 3, 6, 9]]
<class 'pandas.core.frame.DataFrame'>
 
Out[10]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
6 Afghanistan Asia 1982 39.854 12881816 978.011439 AFG 4
9 Afghanistan Asia 1997 41.763 22227415 635.341351 AFG 4
 

행열 데이터 한번에 추출하기

이번에는 행열 데이터를 한번에 추출하는 방법을 알아보겠습니다. 데이터프레임에서 행열 데이터를 한번에 추출하는 방법은 크게 두가지가 있습니다. 1) .loc[인덱스, 컬럼]를 사용하는 방법과 2) .iloc[행 번호, 열 번호]를 사용하는 방법입니다.

자세한 내용은 아래 예제를 보면서 알아보겠습니다.

 

In [11]:
# 예제1 .loc[]
# 인덱스 이름이 100인 모든 컬럼 값에 대한 데이터를 추출합니다.
df.loc[100, :]
 
Out[11]:
 
country      Bangladesh
continent          Asia
year               1972
lifeExp          45.252
pop            70759295
gdpPercap       630.234
iso_alpha           BGD
iso_num              50
Name: 100, dtype: object
 
In [12]:
# 예제2 .iloc[]
# 행번 호가 100인 모든 컬럼 값에 대한 데이터를 추출합니다.
df.iloc[100, :]
 
Out[12]:
 
country      Bangladesh
continent          Asia
year               1972
lifeExp          45.252
pop            70759295
gdpPercap       630.234
iso_alpha           BGD
iso_num              50
Name: 100, dtype: object
 
여러개의 데이터를 추출하고 싶다면 리스트(list)를 사용하면 됩니다.
 
In [13]:
# 예제3 .loc[]
# 인덱스 리스트와 컬럼 리스트를 만족하는 데이터를 추출합니다.
df.loc[[0, 100, 200, 300, 400], ['country', 'year', 'pop']]
 
Out[13]:
 
  country year pop
0 Afghanistan 1952 8425333
100 Bangladesh 1972 70759295
200 Burkina Faso 1992 8878303
300 Colombia 1952 12350771
400 Czech Republic 1972 9862158
 
In [14]:
 
# 예제4 .iloc[]
# 행 번호 리스트와 컬럼 번호 슬라이싱 구문을 만족하는 데이터를 추출합니다.
df.iloc[[0, 100, 200, 300, 400], :3]
 
Out[14]:
 
  country continent year
0 Afghanistan Asia 1952
100 Bangladesh Asia 1972
200 Burkina Faso Africa 1992
300 Colombia Americas 1952
400 Czech Republic Europe 1972

 

 

-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.