Pandas 특정 행 추출 - Pandas teugjeong haeng chuchul

3. 데이터 선택하기 (Data Selection)

.iloc.locindex slicingpandas

특정 열 선택

DataFrame이 가지고 있는 []를 이용해 슬라이싱하여 출력하는 방법입니다. 특정 열 값만 가지고 오고 싶다면'데이터프레임명'['Column명']과 같은 형태로 입력합니다. 이는 df.A와 동일합니다. 리턴되는 값은 Series의 자료구조를 가지고 있습니다.

print(df['A'])

print(df.A)

특정 행 선택

특정 행 추출과 특정 행 범위 추출은 사용하는 방식이 다릅니다. 특정 행 및 행 범위 추출을 위해서는 인덱스 슬라이싱 기법을 사용해야 합니다.

print(df[0:3])

print(df['20130102' : '20130104'])

print(df['20130102' : '20130102'])

.loc (이름을 이용한 데이터 선택)

라벨의 이름을 이용하여 선택할 수 있는 .loc 속성도 있습니다. 첫 번째 인덱스 값인 '2013-01-01'에 해당하는 모든 컬럼의 값 가져오기와 같은 작업을 수행할 수 있습니다.

print(df.loc[dates[0]])

print(df.loc[:, ['A', 'B']])

print(df.loc['20130102':'20130104',['A','B']])

.iloc (위치를 이용한 데이터 선택)

위치를 나타내는 인덱스 번호를 사용하여 데이터를 선택할 수 있습니다.

print(df.iloc[3])

print(df.iloc[3:5, 0:2])

print(df.iloc[:, 1:3])

print(df.iloc[:, 1:3].name)

조건을 이용한 데이터 선택

특정한 행이나 열에 조건을 달아 만족하는 행이나 열만 선택하여 데이터를 추출할 수 있습니다.

isin()

필터링을 해야 하는 경우에 사용합니다.

print(df[df.A > 0])

print(df[df > 0]

print(df['E'] = ['one', 'one','two','three','four','three'])

print(df[df['E'].isin(['two', 'four'])])


카테고리 없음

2019. 12. 25. 16:51

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

데이터 불러오기

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]:

 countrycontinent
0Afghanistan Asia
1Afghanistan Asia
2Afghanistan Asia
3Afghanistan Asia
4Afghanistan 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]:

 countrycontinent
0Afghanistan Asia
1Afghanistan Asia
2Afghanistan Asia
3Afghanistan Asia
4Afghanistan Asia

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

행 데이터 추출하기

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

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

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

In [5]:

# print() 함수를 이용하지 않아도 주피터 노트북이 결과를 출력해줍니다.
# 단, 이 경우 마지막 명령만 출력됩니다.
df.head()

Out[5]:

 countrycontinentyearlifeExppopgdpPercapiso_alphaiso_num
0Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4Afghanistan 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

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

# 여러 개의 행 데이터를 추출하기 위해서
# 인덱스 리스트를 만들어 .loc[] 안에 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 DataFrame을 반환합니다.
print(type(df.loc[[0, 3, 6, 9]]))
df.loc[[0, 3, 6, 9]]

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

Out[7]:

 countrycontinentyearlifeExppopgdpPercapiso_alphaiso_num
0Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
3Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
6Afghanistan Asia 1982 39.854 12881816 978.011439 AFG 4
9Afghanistan 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]:

 countrycontinentyearlifeExppopgdpPercapiso_alphaiso_num
1Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
5Afghanistan Asia 1977 38.438 14880372 786.113360 AFG 4
6Afghanistan 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[]과 마찬가지로 여러개의 행 데이터를 추출하기 위해서는 대괄호를 두번 사용합니다. 컬럼을 추출하는 것과 유사합니다.

# 여러 개의 행 데이터를 추출하기 위해서
# 행 번호 리스트를 만들어 .iloc[] 안에 집어넣습니다.
# 컬럼 데이터를 추출하는 것과 마찬가지로 
# 대괄호가 하나인 경우에는 DataFrame을 반환합니다.
print(type(df.iloc[[0, 3, 6, 9]]))
df.iloc[[0, 3, 6, 9]]

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

Out[10]:

 countrycontinentyearlifeExppopgdpPercapiso_alphaiso_num
0Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
3Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
6Afghanistan Asia 1982 39.854 12881816 978.011439 AFG 4
9Afghanistan 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]:

 countryyearpop
0Afghanistan 1952 8425333
100Bangladesh 1972 70759295
200Burkina Faso 1992 8878303
300Colombia 1952 12350771
400Czech Republic 1972 9862158

In [14]:

# 예제4 .iloc[]
# 행 번호 리스트와 컬럼 번호 슬라이싱 구문을 만족하는 데이터를 추출합니다.
df.iloc[[0, 100, 200, 300, 400], :3]

Out[14]:

 countrycontinentyear
0Afghanistan Asia 1952
100Bangladesh Asia 1972
200Burkina Faso Africa 1992
300Colombia Americas 1952
400Czech Republic Europe 1972

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