Python/Pandas Tutorial

[Python] Pandas Tutorial :: Filtering(Selecting) rows, columns in pandas DataFrame

슈퍼짱짱 2020. 9. 21. 16:20
반응형

2020/09/18 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: pandas란? 데이터프레임이란? 시리즈란?

2020/09/19 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: read csv, txt file with pandas

2020/09/21 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Create Data Frame with Dictionary, List

2020/09/21 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Save Pandas Data Frame to CSV file

 

 

행 또는 열을 인덱싱하는 방법은 여러가지가 있는데

1. 위치로 뽑아오는 방법,

2. label (row name, col name) 로 뽑아오는 방법,

3. 어떠한 condition에 만족하는 부분만 뽑아 오는 방법이 있다.

 

본 포스팅에서 위 세 가지 방법에 대해 indexing 하는 방법을 알아보겠다.


Pandas DataFrame 에서 Indexing 하는 방법

0. Import pandas library

 

import pandas as pd

 

1. read csv file :: 실습파일 불러오기

 

df = pd.read_csv("01. Data/friend_list_no_head.csv",
                 header=None,
                 names=['name','age','job'])

 

friend_list_no_head.csv
0.00MB

 

> df

 

    name  age        job
0   John   20    student
1  Jenny   30  developer
2   Nate   30    teacher
3  Julia   40    dentist
4  Brian   45    manager
5  Chris   25     intern

 

2. rename index :: 실습을 위해 Index name 변경하기

 

df = df.rename(index={0:"zero",
                      1:"one",
                      2:"two",
                      3:"three",
                      4:'four',
                      5:'five'})

 

> df

 

        name  age        job
zero    John   20    student
one    Jenny   30  developer
two     Nate   30    teacher
three  Julia   40    dentist
four   Brian   45    manager
five   Chris   25     intern

 

 


3. row(recode) indexing

 

3-1. by integer position

 

첫 번째 record 만 indexing 하는 방법은 다음과 같다.

 

df[0:1]
df.iloc[0]

 

> df[0:1]

 

      name  age      job
zero  John   20  student

 

> df.iloc[0]

 

name       John
age          20
job     student
Name: zero, dtype: object

 

(참고) loc VS iloc 

 

DataFrame을 인덱싱하는데 lociloc을 많이 사용한다.

이 둘의 차이는 loclabel(row name, col name) 으로 indexing 하는 것이고, ilocinteger position으로 indexing 한다는 것이다.

 

예제 코드는 다음과 같고, 자세한 설명은 본 포스팅에서 예제를 통해 하겠다.

temp
#        name  age        job
# zero   John   20    student
# one   Jenny   30  developer
# two    Nate   30    teacher

temp.loc[['zero','two'],['name','age']]
#       name  age
# zero  John   20
# two   Nate   30

temp.iloc[[0,2], 0:2]
#       name  age
# zero  John   20
# two   Nate   30

# temp.loc[[0,2], 0:2] ## error
# temp.iloc[['zero','two'],['name','age']] ## error

 

참고로 그냥 df[0]을 하면 에러가 난다. 0:1로 인덱싱하거나, iloc을 사용한다.

또한, 0:1, 0:3 처럼 이어지지 않고 (0번째, 3번째) 처럼 떨어진 position의 레코드를 인덱싱 하고 싶다면 iloc을 사용해야 한다.

 

예를 들어 첫 번째, 세 번째 레코드를 위치로 인덱싱하는 방법은 다음과 같다.

 

> df.iloc[[0,2],:] # or df.iloc[[0,2]]

 

      name  age      job
zero  John   20  student
two   Nate   30  teacher

 


3-2. by label

 

위치가 아니라 지정된 label 로 인덱싱 하는 방법은 iloc 이 아닌 loc을 사용하면 된다.

 

> df.loc[['one','five']] # or df.loc[['one','five'],:]

 

       name  age        job
one   Jenny   30  developer
five  Chris   25     intern

 

또는 filter 로도 같은 결과를 낼 수 있다.

주의할 점은 row를 인덱싱 할 때는 axis = 0을 지정해 주고, column을 대상으로 할 때는 axis = 1로 지정해 준다.

 

df.filter(items=['one','five'], axis=0)

 


3-3. by row names

 

row name condition으로 row를 인덱싱하는 방법은 다음과 같다.

 

예를 들어 row index에 'o' 가 포함된 레코드만 뽑아오고 싶다면 like = 'o' 를 통해 뽑아올 수 있다.

 

> df.filter(like = 'o', axis = 0)

 

       name  age        job
zero   John   20    student
one   Jenny   30  developer
two    Nate   30    teacher
four  Brian   45    manager

 

정규표현식으로 원하는 condition을 지정할 수도 있는데, regex = '' 으로 원하는 정규표현식을 넣어주면 된다.

끝자리가 'e'로 끝나는 row 는 다음과 같이 불러온다.

 

> df.filter(regex='e$', axis = 0)

 

        name  age        job
one    Jenny   30  developer
three  Julia   40    dentist
five   Chris   25     intern

 


3-4. by column conditions

 

컬럼 condition으로 row 를 indexing 하는 방법은 다음과 같다.

 

예를 들어 나이가 30세 이상인 row만 indexing 하려면 조건을 직접 넣어주면 된다.

SQL 처럼 query를 넣어 줄 수도 있다.

 

> df[df.age >= 30]
> df.query('age >= 30')

 

        name  age        job
one    Jenny   30  developer
two     Nate   30    teacher
three  Julia   40    dentist
four   Brian   45    manager

 

두 가지 조건을 지정해 줄 수도 있다.

나이가 30세 이상이고 직업이 manager인 사람은 다음과 같이 뽑을 수 있다.

 

> df[(df.age >= 30) & (df.job == 'manager')]

> df.query('(age >= 30) & (job == "manager")')

 

       name  age      job
four  Brian   45  manager

 

단, 주의할 점은 query는 각각의 조건을 괄호로 묶어주지 않아도 되지만, 첫 번째 코드에서 괄호를 빼주면 에러가 나다.

 


4. column(item) indexing

컬럼을 인덱싱하는 방법도 위와 거의 동일하다. 주의할 점은 axis = 0이 아니라 axis = 1을 넣어 주어야 한다.

 

4-1. by integer position

 

원하는 컬럼위 위치 앞에 원하는 row의 위치를 써 주어야 한다. 

row 를 전부 다 가지고 오고 싶다면 : 를, 0~3번째 만 가지고 오고 싶다면 0:4를 넣어주면 된다.

 

> df[:, 0]

 

zero      John
one      Jenny
two       Nate
three    Julia
four     Brian
five     Chris
Name: name, dtype: object

 

> df[0:4, 0]

 

zero      John
one      Jenny
two       Nate
three    Julia
Name: name, dtype: object

 

4-2. by label

 

axis = 1 in filter

 

> df.filter(items=['name','job'], axis=1)

        name        job
zero    John    student
one    Jenny  developer
two     Nate    teacher
three  Julia    dentist
four   Brian    manager
five   Chris     intern

 


5. indexing row and column 

 

> df.iloc[[1,5], [0,2]]

> df.loc[['one','five'],['name','job']]

 

       name        job
one   Jenny  developer
five  Chris     intern

 


참고

 

www.youtube.com/watch?v=Nu6GIczsOp0&list=PLVNY1HnUlO25etNe08s1H1nIIbbZdJwxA&index=5

 

반응형